Siehe das folgende Schlie?ungsproblem
var x=10;
function fn() {
console.log(x);
}
function show(f) {
var x=20;
(function() {
f();
})();
}
show(fn);
Es wird 10 statt 20 ausgegeben. Wenn x verwendet wird, wird dann nicht entlang der Gültigkeitsbereichskette nachgeschlagen? Wenn die Gültigkeitsbereichskette beim Erstellen der Funktion bestimmt wird, ist das Ergebnis 10. Wenn sie beim Erstellen der Funktion bestimmt wird aufgerufen, es sollte 20 sein. Ja Keine genaue Aussage über die Scope-Kette? Wie sollte hier die genaue Scope-Kette aussehen? Sind Fn und Show auf dem gleichen Niveau oder liegt Fn innerhalb von Show?
溫故而知新,可以為師矣。 博客:www.ouyangke.com
作用域鏈是在函數(shù)定義的時候確定的.
在函數(shù)內(nèi)定義的變量不能在函數(shù)之外的任何地方訪問,因為變量僅僅在該函數(shù)的域的內(nèi)部有定義。相對應(yīng)的,一個函數(shù)可以訪問定義在其范圍內(nèi)的任何變量和函數(shù)。換言之,定義在全局域中的函數(shù)可以訪問所有定義在全局域中的變量。在另一個函數(shù)中定義的函數(shù)也可以訪問在其父函數(shù)中定義的所有變量和父函數(shù)有權(quán)訪問的任何其他變量。
https://developer.mozilla.org...
作用域鏈是動態(tài)的,所以,在調(diào)用時確定。
但是你的這個代碼中,閉包定義的function()是綁定的最外層的作用域
function所申明的函數(shù)默認是綁定的外層的作用域
(我也是在學習中。。。)
在函數(shù)創(chuàng)建的時候創(chuàng)建一個包含全局變量對象的作用域鏈,儲存在內(nèi)部[[Scope]]屬性中。函數(shù)執(zhí)行的時候會創(chuàng)建一個執(zhí)行環(huán)境,通過復(fù)制[[Scope]]屬性中的對象,構(gòu)建執(zhí)行環(huán)境的作用域鏈,并把自己的活動對象推入該作用域鏈的前端以此形成完整的作用域鏈。[[Scope]]保存的是對全局變量的引用,而不是值的復(fù)制。
var a = 10;
function f(){
console.log(a);
};
function foo(){
a = 20;
f();
};
foo() // 20;
閉包的調(diào)用方式和下面效果等價的,下面舉得例子通過對比說明了,作用域鏈是和函數(shù)定義時位置相關(guān)的。
var x=10;
function fn(){
console.log(x);
}
function show() {
var x=20;
fn();
}
show(); //輸出10
-----------------------
var x=10;
function show() {
var x=20;
function fn(){
console.log(x);
}
fn();
}
show(); //輸出20
相關(guān)問題鏈接補充。/q/10...。有關(guān)于作用域鏈的討論。