1. 程式人生 > >js中加“var”和不加“var”的區別

js中加“var”和不加“var”的區別

lob blog 方式 color 新版 模式 details delete ble

Javascript聲明變量的時候,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運行的代碼並不代表是合適的代碼。

1.都加var,在方法內則是局部變量,在方法外則是全局變量。

2.都不加var,全是全局變量。

3.在方法內,加var為局部變量,不加var則是全局變量(在執行當前方法之後)。



var num1 = 1;

是在當前域中聲明變量. 如果在方法中聲明,則為局部變量(local variable);如果是在全局域中聲明,則為全局變量(global variable)。

而 num2 = 1;

事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域etc。。。)中解析 num; 如果在任何當前作用域鏈中找到num,則會執行對num屬性賦值; 如果沒有找到num,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造num屬性並賦值。

註意!它並不是聲明了一個全局變量,而是創建了一個全局對象的屬性。

即便如此,可能你還是很難明白“變量聲明”跟“創建對象屬性”在這裏的區別。事實上,Javascript的變量聲明、創建屬性以及每個Javascript中的每個屬性都有一定的標誌說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。

由於變量聲明自帶不可刪除屬性,比較var num = 1 跟 num = 1,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;後者為全局變量的一個屬性,因此可以從全局變量中刪除。

http://blog.csdn.net/charlene0824/article/details/52252824 --JavaScript中的作用域鏈詳解

在Web瀏覽器中,全局執行環境被認為是window對象,因此所有全局變量和函數都是作為window對象的屬性和方法創建的。

所以num1和num2都是window對象的屬性,只不過不加var聲明的變量可以被delete掉。

在ECMAScript5標準中,有一種“嚴格模式”(Strict Mode)。在嚴格模式中,為未聲明的標識符賦值將會拋引用錯誤,因此可以防止意外的全局變量屬性的創造。目前一些瀏覽器的新版本已經支持。

js中加“var”和不加“var”的區別