作用域鏈的這種配置機制引出了乙個值得注意的***,即閉包只能取得包含函式中任何變數的最後乙個值,別忘了閉包所儲存的是整個變數物件,而不是某個特殊的變數。下面的例子可以清晰的說明這個問題:
function createfunctions()}return
result;
}
這個函式會返回乙個函式陣列,表面上看,似乎每個函式都應該返回自己的索引值,即位置0的函式返回0,位置1的函式返回1,以此類推,但實際上,每個函式都返回10,因為每個函式的作用域鏈中都儲存著createfunctions()函式的活動物件,所以他們引用的都是同乙個變數i。當createfunctions()函式返回後,變數i的值是10,此時每個函式都引用著儲存變數i的同乙個變數物件,所以在每個函式內部i的值都是10。但是,我們可以通過建立另乙個匿名函式強制讓閉包的行為符合預期,如下所示:
functioncreatefunctions()
}(i)
}return
result
}
在重寫了前面的createfunctions()函式後,每個函式就會返回各自不同的索引值了,在這個版本中,我們沒有直接他閉包賦值給陣列,而是定義了乙個匿名函式,並將立即執行該匿名函式的結果賦給陣列,這裡的匿名函式有乙個引數,也就是最終的函式要返回的值。在呼叫每個匿名函式時,我們傳入了變數i,由於函式引數是按值傳遞的,所以就會將變數i的當前值複製給引數num。而在這個匿名函式內部,又建立並返回了乙個訪問num的閉包。這樣一來,result陣列中的每個函式都有自己num變數的乙個副本,因此就可以返回各自不同的數值了。
閉包與變數
js高程中關於閉包與變數這一節,講到乙個案例,我當時看的一臉懵逼,然後就自習的研究了一下,先上 function createfunctions return result 呼叫最外層函式,接收返回的陣列 var arr createfunctions 迴圈遍歷陣列,呼叫每個元素並列印 for va...
閉包與變數
作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中的任何變數的最後乙個值。別忘了閉包所儲存的時整個變數物件,而不是某個特殊的變數。下面這個例子可以清晰地說明這個問題 function createfunction return result 這個函式返回的函式陣列中,所有函式的內部...
閉包與變數
作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數。function createfunctions return result 上述函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置0...