簡體   English   中英

全局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

檢查這個Demo jsFiddle

在另一個變量 g中你定義的是一個'私有'變量(在函數范圍內 ),因此它在函數內的 “內部”值警告。 希望這對你有所幫助!

var不是聲明。 混淆了許多人是一種混亂。 相反, var范圍范圍的注釋。 將'var'放置在范圍內並不重要。

JavaScript中的var是Annotation,而不是Statement

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM