與var
聲明的所有變量都提升到在聲明它們的函數的頂部,因此,如果變量被定義在函數內部,它將被移動到函數的頂部,並且如果它在全局範圍中被定義,它將被移動到全局上下文的頂部。
(function() {
bar = 5;
var bar = 10;
console.log("value of bar inside the self invoking function = " + bar);
})();
在這裏,你的情況,你已經定義的變量的匿名函數裏面,所以它會被移動到該函數的頂部,並提升它會像
(function() {
var bar;
bar = 5;
bar = 10;
//...rest of the code
})();
但這個變量之後僅在該功能的本地範圍中可用,它在全局範圍內不可用。這就是爲什麼當您試圖在全球範圍中訪問Uncaught ReferenceError
時。
這裏是一篇很好的文章,解釋JavaScript中的變量範圍和變量提升。 http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/
有一點要注意的是,只有使用var
聲明的變量懸掛。如果您使用ES6 let
關鍵字來聲明變量,那麼它將不會被掛起。所以
(function() {
bar = 5;
let bar = 10;
console.log("value of bar inside the self invoking function = " + bar);
})();
將無法正常工作,你會得到同樣的錯誤。你可以閱讀更多關於它here
感謝您的答案。 – manjum2050
如果您對答案滿意,則可以通過單擊答案分數下的複選標記將其標記爲「已接受」。 –
@ Karl-JohanSjögren謝謝。我不知道這個,因爲我是堆棧溢出的新手。 – manjum2050