JavaScript高级编程 5.5-6

作者: RGXMG | 来源:发表于2017-09-07 00:34 被阅读0次

    1.function是对象、创建的也是对象引用

    三种创建方式 最后一种不推荐
    M1:

    function func(){
      alert("使用很普遍的函数创建方式");
    }
    

    M2:

    var func=function(){
      alert("直接储存在变量当中");
     }
    

    M3:

    var func=function("参数1","参数2","参数n","alert("不要花括号,直接创建")");
    

    2. 在代码运行之前,解析器经过 代码提升的过程 首先将函数声明创建出来 确保函数能够正常使用 再将声明函数提到顶部 然后执行

    函数调用在函数创建之前,结果并不会出错。

    var Vsum=sum(10);
    alert(Vsum); 
    function sum(maxV){
      "use strict"
      for(var i=0;i<maxV;i++){
        var sum+=0;
      }
      return sum;
    }
    
    

    另一种情况就会出错。

    var Vsum=sum(10);
    alert(Vsum); 
    var sum=function(maxV){
      "use strict"
      for(var i=0;i<maxV;i++){
        var sum+=0;
      }
      return sum;
    }    //unexpected identifier
    
    出错的原因就是因为函数创建位于顶部,但是函数的声明不是

    3.函数内部拥有argument和this俩个特殊对象

    argument是保存拥有它的函数的参数
    argument拥有一个属性callee、它是一个指针 能够指向拥有argument对象的函数

    这个方法可以用来解耦合 经典例子 递归实现阶乘

      alert(factorial(10));
      function factorial(Vmax){   //Vmax>0
          if(Vmax<=1)return 1;
          else{
            return Vmax*factorial(Vmax-1);  
      }
     }
    
    利用arguments节耦合
      alert(factorial(10));
      funciton factorial(Vmax){
        if(Vmax<=1)return 1;
        else{
          return Vmax*arguments.callee(Vmax-1);
          }
      }
    
    但在严格模式下使用会出错

    4. this对象 类似java和c#中的this 都是指向当前的作用域 当没有其他作用域时候 指向window 例子:

    5. ECMAScript5还定义函数对象另一个属性caller、它保存着引用当前函数的函数的引用、如果为window则为null 实例:

    除此之外、ECMAScript还为每个函数对象定义了length和prototype属性方法。length表示每个函数对象希望能接受几个参数 prototype则是真正保存着函数中所有实例方法真正所在 实际上toString和ValueOf都是保存在prototype名下 只是通过各自的实例对象调用罢了

    每个函数都包含着非继承而来的方法 apply和call方法

    apply和call方法都接受俩个参数
    第一个参数都接收作用域this
    第二个参数apply可以接收数组参数或者arguments(保存当前函数的参数) call则只能接收按顺序排列单个排列的参数

    需要注意的是 apply和call最主要用作扩充函数的作用域、而非传递函数。
    window.color="red";//全局属性
    var o_bule={
        color:"bule"
    }
     function toStringColor(){
             console.log(this.color);
    }
    toStringColor.call(this);//red
    toStringColor.call(o_bule);//bule
    toStringColor().call(window); //red
    

    相关文章

      网友评论

        本文标题:JavaScript高级编程 5.5-6

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