javascript详解系列-函数表达式

1.递归

function fact(num){
   if(num<1){
        return 1;  
    }  
     else{
        return num*fact(num-1);
    }
}

  var author = fact;

  fact= null;

  console.log(author(4));  会出现问题;

改进型:

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

即便把函数赋值给另一个名字,函数依然有效。

2.闭包与变量

  作用域链的这种配置机制引出了一个副作用。即闭包只能取得包函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。

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

这个函数会返回一个函数数组,表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0,以此类推。但实际上,每个函数都返回10.因为每个函数的作用域链中都保存着createFunctions()

的活动对象,所以他们引用的都是同一变量i,当函数createFunctions()返回后,变量i的值是10.但此时候函数应用者保存变量i的同一个变量i。所以在函数内部i的值是10;但是我们可以通过创建另一个匿名函数来符合预期,

如下:

function createFunctions(){
       var result = new Array();
       for(var i=0; i<10; i++){
         result[i] = function(num){
              return function(){
                      return num;
              }
          }(i);    
       }  
        return result;
}  

在这个版本中,我们没有直接把闭包赋给数组,而是定义了一个匿名函数,并将立即执行的这个结果返回给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数时,我们就传入了

变量i。由于函数参数是按值传递的,所以就将i的当前值赋值给每个参数num;而在这个函数内部,又创建了一个返回num的闭包。这样一来,result数组中每个函数都有自己的num变量的一个副本。因此就可以返回不同的

数值了。

 还有一个经典的例子看高三182页。

posted @ 2016-11-30 12:53  侧耳倾听的世界  阅读(128)  评论(0编辑  收藏  举报