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值传递进去。
静态做用域闭包,变量共享javascript
// 全局变量 "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"传递下去
注意一点问题java
js中function关键字是看成函数的声明,是不能直接跟()的,只有表达式是能够数组
这样是有错的闭包
function(a){ alert(a); }(1);
可是这样是能够的函数
var t = function(a){ alert(a); }(1);
或者这样spa
(function(a){ alert(a); })(1);