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);