看到如下的一個閉包問題
var x=10;
function fn() {
console.log(x);
}
function show(f) {
var x=20;
(function() {
f();
})();
}
show(fn);
列印的是10而不是20,x在取值時不是沿著作用域鏈向上尋找嗎,如果作用域鍊是在函數建立時確定結果就是10,如果是在呼叫時確定就應該是20 ,有沒有關於作用域鏈準確的說法?這裡準確的作用域鏈應該是什麼樣的呢? fn和show處於同等級還是fn在show內?
作用域鏈是在函數定義的時候確定的.
https://developer.mozilla.org...
作用域鍊是動態的,所以,在呼叫時確定。
但是你的這個程式碼中,閉包定義的function()是綁定的最外層的作用域
function所申明的函數預設是綁定的外層的作用域
(我也是在學習中。。)
在函數創建的時候創建一個包含全域變數物件的作用域鏈,儲存在內部[[Scope]]屬性中。函數執行的時候會創造一個執行環境,透過複製[[Scope]]屬性中的對象,建構執行環境的作用域鏈,並把自己的活動對象推入該作用域鏈的前端以此形成完整的作用域鏈。 [[Scope]]保存的是對全域變數的引用,而不是值的複製。
閉包的呼叫方式和下面效果等價的,下面舉得例子透過對比說明了,作用域鍊是和函數定義時位置相關的。
相關問題連結補充。 /q/10...。有關於作用域鏈的討論。
非嚴格模式任何IIFE的this指向都是window
以上文不對題。 。 。