匿名函數-閉包

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);
相關文章
相關標籤/搜索