美文网首页
函数基本概念

函数基本概念

作者: astak3 | 来源:发表于2018-04-21 12:40 被阅读0次

    函数

    通过函数可以封装任意多条语句,可以在任何地方,任何时候调用执行。每个函数都是function类型的实例,和其他引用类型一样具有属性和方法。
    把函数保存为对象中的一个属性时,该属性称之为方法

    函数声明语法方式

    1. 普通声明方式
    function sum (){
            return num1 + num2;
    }
    
    1. 使用变量初始化函数
    var sum = function(num1,num2){
            return num1 + num2;
    }
    
    1. 使用function构造函数,这种方法不推荐。这种方法便于理解“函数是对象,函数名是指针”的概念。
    var sum = new Function("num1","num2","return num1 + num2");
    

    delete可删除属性,用法delete.a.name

    作为值的函数

    任何函数在任何时候都可以通过return语句来返回值。需要注意的是位于return语句之后的一句语句永远不会执行。
    调用函数(方法)如果没有圆括号,会打印函数代码,有括号才会打印函数值。

    function sum(num1,num2){
        return num1 + num2;     //返回 num1 + num2 相加的和
        alert("Hello world!");  //永远也不会执行
    } 
    

    函数参数

    声明函数时没有给参数,但调用函数时会传参。
    函数内部可用argument方法获取,配合length使用可动态传参。

    function sum(){
        if(arguments.length == 1){
            alret(arguments[0] + 10);
        }else if(arguments.length == 2){
            alert(arguments[0] + arguments[1] + 10);
        }
    }
    
    sum(10)     //打印20
    sum(10,20)  //打印40
    

    JavaScript 函数没有重载

    重载是根据参数,选择相同函数名而参数不同的函数。

    阶乘函数

    function factorial(){
        if(num < 1){
            return 1;
        }else{
            return num * arguments.callee(num -1);//arguments.callee调用自身函数。这里调用的是factorial函数。
        }
    }
    

    this

    this引用的是函数执行的环境对象,也就是函数调用语句所处的那个作用域。当网页在全局作用域中调用函数时,这个this对象引用的就是windowwindow是一个对象,而且是JS里最大的对象,是最外围的对象。

    var color = "red";      //这里color是全局变量,而这变量又是window的属性
    alert{window.color};    //打印"red",这说明color是window下的属性
    alert(this.color);      //同上
    
    window.color = "red";   //相当于 var color = "red"
    alert(this.color);      //打印"red"
    
    var o ={
        color: "blue";      //这里的color是o下的属性,也就是局部变量
        sayColor: function(){
            alert(this.color);  //这里的this代表的是o对象
        }
    };
    
    o.sayColor();           //打印"blue"
    

    下面的代码其实和上面是一样的,只是将sayColor()函数作为方法赋值给o,然后在通过o来调用它

    window.color = "red";       //全局        
    var o = {color: "blue"};    //局部
    
    function sayColor(){        
        alert(this.color);      //这里执行的时候是动态的,第一次指向window,第二次指向sayColor
    }
    
    sayColor();                 //打印"red",因为这里是在window下的
    o.sayColor = sayColor;      //这里是吧把sayColor作为方法赋值给o,这样的话this就指代o了
    o.sayColor();               //这里执行的是box里面的this.color,也就是说这里this指向了box
    

    prototype

    prototype是保存他们所有实例方的真正所在,toStringvalueOf等方法都是保存在peototype名下,只不过是通过各自对象的实例访问。
    每个函数都包含两个非继承而来的方法:apply()call()这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
    apple()接收两个参数,一个是其中运行函数的作用域,另一个是参数数组。
    call()apple()方法一样,区别是call()方法传递给函数的参数必须逐个传。

    function sum(num1,num2){
        return num1 + num2;
    }
    
    function sum1(nu1,num2){
        return sum.apply(this,arguments);   //arguments可以当数值传,等于下面的[num1,num2];this表示window作用域
    }
    
    function sum2(nu1,numw){
        return sum.apply(this,[num1,num2]); //apply可以冒充另一个函数,这里冒充了sum;[]表示传递的参数 
    }
    
    alert(sum1(10,10));        //打印20
    alert(sum2(10,10));        //打印20
    

    这两方法最大的用处是:扩充函数运行的作用域。

    window.color = "red";       //全局        
    var o = {color: "blue"};    //局部
    
    function sayColor(){        
        alert(this.color);      //这里this是动态的
    }
    
    sayColor();                 //打印"red"
    
    //用call实现对象冒充
    sayColor.call(this);        //冒充window
    sayColor.call(window);      //冒充window
    sayColor.call(o);           //冒充sayColor,用call的好处:对象不需要与方法发生任何耦合关系(耦合:互相关联的意思,扩展和维护会发生连锁反应)
    

    相关文章

      网友评论

          本文标题:函数基本概念

          本文链接:https://www.haomeiwen.com/subject/zthxlftx.html