2016-08-28 54 views
4

爲什麼函數的定義範圍有限,使得像這樣的代碼不起作用?爲什麼在另一個內部調用的函數不能訪問外部函數的作用域?

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的塊作用域)。 所以我想我的問題是,爲什麼不能在另一個內部調用的函數訪問外部函數的作用域,就像它在裏面定義一樣?那會是什麼缺點?

+0

這看起來好像需要用未聲明的變量編寫函數,稍後由周圍的調用上下文填充。在我看來(不言而喻,不是一個語言設計者)就像是傳遞爭論的一個非常混亂的選擇。換句話說,函數已經*有一種方法來接受調用上下文中的值:參數。使用兩種不同的方法來提供正確的值似乎令人困惑(例如,想象需要記錄一個函數接受哪些參數*以及*期望調用上下文聲明哪些變量)。 – apsillers

回答

1

兩種方式都是可能的。

你在說什麼叫做「Dynamic Sc​​oping」。 JavaScript和幾乎所有的東西都被稱爲「詞法範圍」。你可以谷歌這兩個人就這個話題進行大量的討論。

過去有些語言嘗試動態範圍界定。不過,事實上,很長一段時間以來,動態範圍確定讓人們很難理解程序並弄清楚發生了什麼。

通過詞彙範圍確定,您可以通過查看您正在使用的變量的哪個「版本」來進行分析,但是可以通過動態範圍確定,這可能取決於誰在呼喚您,並且這會讓您很難使用任何操作這些變量。

+0

哦。我發現我的編輯器會自動啓用嚴格模式,而我不會注意到這導致我相信「動態範圍」在JavaScript中不可行。謝謝 :-) –

相關問題