爲什麼函數的定義範圍有限,使得像這樣的代碼不起作用?爲什麼在另一個內部調用的函數不能訪問外部函數的作用域?
function foo() {
var text = "abc";
bar(); // ReferenceError because bar cannot access foo's local variables
}
function bar() {
console.log(text); // Calling bar inside foo does not grant it access to foo's local variables
}
foo();
我只能想象酒吧工作,如果我們定義了一個名爲文本一個全局變量。
我明白,我們可以有訪問函數的局部變量的唯一方法是通過創建這樣一個
function foo() {
var text = "abc";
return function() {
console.log(text);
}
}
bar = foo();
bar();
那麼封閉,我這樣想,我理解JavaScript作用域(包括ES6的塊作用域)。 所以我想我的問題是,爲什麼不能在另一個內部調用的函數訪問外部函數的作用域,就像它在裏面定義一樣?那會是什麼缺點?
這看起來好像需要用未聲明的變量編寫函數,稍後由周圍的調用上下文填充。在我看來(不言而喻,不是一個語言設計者)就像是傳遞爭論的一個非常混亂的選擇。換句話說,函數已經*有一種方法來接受調用上下文中的值:參數。使用兩種不同的方法來提供正確的值似乎令人困惑(例如,想象需要記錄一個函數接受哪些參數*以及*期望調用上下文聲明哪些變量)。 – apsillers