匿名函数-闭包

function createClose(){
    var r = new Array();

    for (var i = 0; i<10; i++)
    {
        r[i] = function(){
            return i;
        };
        // document.write(r[i] + "<br/>");
    }
    return r;
}

// alert(createClose());

var funs = createClose();
document.writeln(funs.length);

for(var j=0; j<funs.length; j++){
    // document.write(funs[j]() + "<br/>");
    document.writeln(funs[j]());  
}

//输出结果:10,10,10,10,10,10,10,10,10,10
//因为每个r[n]引用都指向 function(){return i} 而最后i = 10; 所以调用数组中的每个函数返回的结果都是10;
//所有闭包函数处在相同的作用域下,会导致变量共享
//解决办法创建一个匿名函数将作用域重新划分 function createCloses(){ var r = new Array(); for (var i = 0; i<10; i++) { r[i] = function(a){ return function(){ return a; }; }(i); document.write("@@ "+r[i]() + "<br/>"); } return r; } var funss = createCloses(); for(var j=0; j<funss.length; j++){ document.write(funss[j]() + "<br/>"); } //输出结果:1,2,3...10 //r[i] 指向一个匿名函数,通过参数a 将i值传递进r[i]指向的匿名函数,所以将a值保存 //关键点在:r[i] = function(a){}(i); (i)将i值传递进去。

 

静态作用域闭包,变量共享

// 全局变量 "x"
var x = 10;
 
// 全局function
function foo() {
  console.log(x);
}
 
(function (funArg) {
 
  // 局部变量 "x"
  var x = 20;
 
  // 这不会有歧义
  // 因为我们使用"foo"函数的[[Scope]]里保存的全局变量"x",
  // 并不是caller作用域的"x"
 
  funArg(); // 10, 而不是20
 
})(foo); // 将foo作为一个"funarg"传递下去

  

注意一点问题

js中function关键字是当作函数的声明,是不能直接跟()的,只有表达式是可以

这样是有错的

function(a){
   alert(a);
}(1);

但是这样是可以的

var t = function(a){
   alert(a);
}(1);

或者这样

(function(a){
   alert(a);
})(1);

 

posted @ 2014-12-04 14:34  lcw5945  阅读(126)  评论(0编辑  收藏  举报