js函数的一些难点

本日又把javascript函数部份温习了一下,把一些难点归结下,为了让书越看越薄,照样决议记下来。

1. 建立函数的2种体式格局:函数声明和函数表达式:

两者的区分:函数声明提拔。函数声明背面不能跟圆括号,但函数表达式背面能够跟圆括号。要将函数声明转化为函数表达式,只需在给函数声明加一对圆括号即可。(function(){})();
函数声明:主要特性:函数声明提拔,在实行代码前先读取函数声明,所以能够把函数声明放在挪用它的语句背面。

sayHi();
function sayHi(){
     alert('hi');
}   //不会报错

函数表达式在运用前必须先赋值。不然会报错。

sayHi();
Var sayHi=function{
     alert('hi');
}   //会报错

2.递归:arguments.callee是一个指向正在实行的函数的指针。

function factorial(num){
     if(num<=1){
          return 1;
     }else{
          return num * arguments.callee(num-1);
     }
}

然则在严厉形式下,不能经由过程剧本接见arguments.callee。可经由过程下面的要领。

var factorial=(function f(num){
     if(num<=1){
          return 1;
     }else{
          return num * f(num-1);
     }
});

3.this对象:

this对象是在运行时基于函数的实行环境绑定的:在全局函数中this即是window,而在函数被看成某个对象的要领挪用时,this即是谁人对象。不过,匿名函数的实行环境具有全局性,因而其this对象一般指向window(固然,在经由过程call()或apply()转变函数实行环境的情况下,this就会指向其他对象)。

var name="the window";
var obj={
     name:"My object",
     getNameFun:function(){
          return function(){
               return this.name;
          }
     }
}
alert(obj.getNameFun()());  //the window

4.屡次声明同一个变量:

function outputNumber(){
     for(var i=0;i<10;i++){
          console.log(i);  //1 2 3 4 5 6 7 8 9
     }
     var i;
     console.log(i);  //10
}

javascript历来不会通知你是不是屡次声清楚明了同一个变量:碰到上述情况,它只会对后续声明置若罔闻(不过,它会实行后续声明中的变量初始化)。匿名函数能够用来模拟块级作用域并防止这个题目。

5.闭包与变量:
因为作用域链的机制,闭包只能获得包括函数中任何变量的末了一个值。是因为闭包所保留的是全部变量对象,而不是某个特别的变量。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(){
               return i;
          }
     }
     alert(result[2]()); //10
     return result;
}

result是一个函数数组,此时每一个函数都引用着保留变量i的同一个变量对象,所以在每一个函数内部i的值都是10. 然则能够经由过程让函数马上实行,来相符我们的预期。

function createFunction(){
     var result=new Array();
     for(var i=0;i<10;i++){
          result[i]=function(num){
               return num;
          }(i)
     }
     alert(result);//0,1,2,3,4,5,6,7,8,9
     return result;
}

因为函数参数是按值通报的,所以会将变量i的当前值复制给参数num,如许,result数组中的每一个函数都有本身num变量的一个副本,因而就能够返回各自差别的数值了。

6.返回一个函数:

function createCompareFunction(pro){
     return function(obj1,obj2){
          var va1=obj1[pro];
          var va2=obj2[pro];
          if(va1<va2){
               return -1;
          }else if(va1>va2){
               return 1;
          }else{
               return 0;
          }
     };
     }
     var compare=createCompareFunction('name');//建立函数
     alert(compare({name:'wsz'},{name:'hh'}));//挪用函数

7.一道面试题:

     var add=function(x){
          var sum=1;
          var tmp=function(x){
               sum=sum+x;
               return tmp;
          }

          tmp.toString=function(){
               return sum;
          }
          return tmp;
     }
alert(add(1)(2)(3));
    原文作者:wslicknet
    原文地址: https://segmentfault.com/a/1190000005687207
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞