![](/img/trans.png)
[英]Why global variable doesn't seem to be affected by inner scope (Javascript)?
[英]Global JavaScript Variable Scope: Why doesn't this work?
所以我正在玩JavaScript並遇到了我認為奇怪的事情。 有人能夠解釋以下內容嗎? (我已將警報值包含在評論中)
為什么foo()內的第一個警報(msg)返回undefined而不是外部 ?
var msg = 'outside';
function foo() {
alert(msg); // undefined
var msg = 'inside';
alert(msg); // inside
}
foo();
alert(msg); // outside
考慮到這些都很好:
var msg = 'outside';
function foo() {
alert(msg); // outside
}
alert(msg); // outside
和:
var msg = 'outside';
function foo() {
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
你的第一個例子中發生的事情是msg的聲明和初始化被拆分,聲明被提升到閉包的頂部。
var msg; //declaration
msg = "inside" //initialization
因此,您編寫的代碼與之相同
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
第二個例子不一樣。 在第二個示例中,您尚未聲明本地變量msg,因此alert(msg)引用全局消息。 這里有一些進一步的閱讀: 吊裝
Javascript閉包中的變量聲明首先發生,無論它們在閉包內的位置如何。 因此,在您的第一個示例中,函數開頭存在局部變量msg
(因為它在函數內聲明),但是在第一個alert
之后才會為其分配值,因此對於第一個警報, msg
未定義。
你的第一個例子相當於:
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
在第二個示例中,您沒有在函數中顯式聲明msg
。 由於已存在具有相同名稱的全局變量,因此使用全局變量而不是定義的本地變量。
在第三個示例中,您顯式聲明了變量並在嘗試使用它之前為其賦值,因此當您發出alert(msg)
時,會alert(msg)
本地定義的變量。
來自http://www.irt.org/script/1321.htm :
如果我們在一個函數內聲明但不是一個帶有
var
關鍵字的變量,它應該是本地的范圍,但是在整個函數中是undefined
,直到它被[初始化] ...
這對你有用:
var msg = 'outside';
function foo() {
alert(window.msg); // outside
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
foo();
alert(msg); // still "outside"
您可以完全控制 java腳本函數 的執行並將變量作為參數傳遞,
在這種情況下,函數內部無法訪問外部變量 。 但是如果你想使用你傳遞變量參數來訪問函數內的那個值。
var msg = 'outside';
function foo(msg) {
alert(msg); // outside
var msg = 'inside';
alert(msg); // inside
}
foo(msg);
alert(msg); // outside
在另一個變量 g中你定義的是一個'私有'變量(在函數范圍內 ),因此它在函數內的 “內部”值警告。 希望這對你有所幫助!
var
不是聲明。 混淆了許多人是一種混亂。 相反, var
是范圍范圍的注釋。 將'var'放置在范圍內並不重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.