匿名函数-闭包
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);