作用域鏈的這種配置機制引出了乙個值得注意的***,即閉包只能取得包含函式中任何變數的最後乙個值。別忘了閉包所儲存的是整個變數物件,而不是某個特殊的變數。下面這個例子可以清晰地說明這個問題。
function
createfunctions
() }
return result;
}var funcs = createfunctions();
for (var i = 0; i < funcs.length; i++)
這個函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返自己的索引值,即位置0的函式返回0,位置1的函式返回1,以此類推。但實際上,每個函式都返回10。因為每個函式的作用域鏈中 8都儲存著 createfunctions()函式的活動物件,所以它們引用的都是同乙個變數 i。當createfunctions()函式返回後,變數i的值是10,此時每個函式都引用著儲存變數i的同乙個變數物件,所以在每個函式內部i的值都是10。但是,我們可以通過建立另乙個匿名函式強制讓閉包的行為符合預期,如下所示。
function
createfunctions
() ;
}(i)
}return result;
}var funcs = createfunctions();
for (var i = 0; i < funcs.length; i++)
在重寫了前面的createfunctions()函式後,每個函式就會返回各自不同的索引值了。在這個版本中,我們沒有直接把閉包賦值給陣列,而是定義了乙個匿名函式,並將立即執行該匿名函式的結果賦給陣列。這裡的匿名函式有乙個引數num,也就是最終的函式要返回的值。在呼叫每個匿名函式時,我們傳入了變數i。由於函式引數是按值傳遞的,所以就會將變數i的當前值複製給引數num。而在這個匿名函式內部,又建立並返回了乙個訪問num的閉包。這樣一來,result陣列中的每個函式都有自己num變數的乙個副本,因此就可以返回各自不同的數值了。 面試題 閉包問題
function console.log y console.log x console.log y 輸出結果為 1 console.log x 輸出結果為 error,直接報錯 解析宣告變數 從右向左賦值,可分解為 y 1 var x y 可見 y 為全域性變數,x為閉包函式內的區域性變數,在co...
JS閉包 面試題
function setobj p p.name bb var p setobj p console.log p 程式的執行結果是aa 匿名函式的this一般是指向window var number 2 var obj var fn1 obj.fn1 console.log number 匿名函式呼...
js閉包面試題
請看以下 在輸出臺的輸出情況 答案是4400,4401,4399,4400 首先,test函式做了什麼?test在自己的函式作用域內建立乙個變數n,以及乙個函式add,這時add就作為乙個閉包,它可以在外部訪問到test內部的變數n,並對其進行加法。然後test返回乙個物件,這個物件有乙個n變數以及...