[英]JavaScript Closure vs. Local
我有一個Javascript主文件,由一個立即調用的閉包括(以免污染'全局':
(function () {
"use strict";
var closureVariable = [];
...
}());
從函數頭中刪除變量時,我做了一個簡單的,有頭骨的編碼錯誤,這樣我的代碼就有了逗號而不是分號:
function fred () {
var i,
closureVariable = [1,2,3,4];
confused();
}
function confused () {
console.log(closureVariable); // Prints '[]'
}
當然,'var i'行上缺少的分號就是問題所在。 然而,我認為應該發生的行為是我現在本地定義的變量'closureVariable'應該遮蔽更高級別的范圍定義,並且我的本地定義變量的值應該可用於范圍鏈中較低的函數(也就是說,'confused'功能應該打印出'[1,2,3,4]';
我在這里對Javascript范圍鏈的理解是什么?
var i,
closureVariable = [1,2,3,4];
在fred
函數和此范圍中定義的函數中提供了兩個新變量。
這些變量與fred
范圍外定義的任何變量完全不同,即使它們碰巧具有相同的名稱。
這里的陰影意味着名為"closureVariable"
的變量阻止對外部作用域中具有相同名稱的變量的任何直接訪問。
您期望的是動態范圍 。 這是一種有效的語言設計選擇,盡管今天被廣泛認為是劣等的。 這不是Javascript的作用。 像許多流行語言一樣,Javascript使用詞法范圍 。 這意味着confused
的范圍不被視為fred
的子范圍,因為它的定義不在fred
的定義范圍內。 fred
call confused
的事實沒有效果。
當您通過省略分號重新定義closureVariable時,它僅在fred函數的上下文中重新定義。 混淆函數存在於閉包的上下文中,因此它仍然可以看到原始的closureVariable。 如果你在fred函數中定義了你的混淆函數,它會看到新的closureVariable並打印[1,2,3,4]
(function () {
"use strict";
var closureVariable = [];
function fred () {
var i,
closureVariable = [1,2,3,4];
function confused () {
console.log(closureVariable);
}
confused(); // print [1,2,3,4]
}
})();
或者,如果你想從fred()外面打電話混淆
(function () {
"use strict";
var closureVariable = [];
var confused;
function fred () {
var i,
closureVariable = [1,2,3,4];
confused = function () {
console.log(closureVariable);
}
}
confused(); // print [1,2,3,4]
})();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.