天天看點

js 聲明——有無var的差別

在簡單的一次嘗試中發現了問題,上圖:

圖一:

js 聲明——有無var的差別

圖二:

js 聲明——有無var的差別

這種情況發生的原因是什麼呢?

有var的是已聲明變量,沒有var的是未聲明變量。在MND的var詞條中有這樣的描述:

将指派給未聲明變量的值在執行指派時将其隐式地建立為全局變量(它将成為全局對象的屬性)。聲明和未聲明變量之間的差異是:

  1. 聲明變量的作用域限制在其聲明位置的上下文中,而非聲明變量總是全局的。
  2. 聲明變量在任何代碼執行前建立,而非聲明變量隻有在執行指派操作的時候才會被建立。
  3. 聲明變量是它所在上下文環境的不可配置屬性,非聲明變量是可配置的(如非聲明變量可以被删除)。

我是否可以這樣了解:未聲明變量,即隐含全局變量,嚴格來說不是真正的變量,而是全局對象的屬性。已聲明變量是真正的變量,無法使用this通路或者删除。

再用一個例子驗證我的想法:

js 聲明——有無var的差別

delete方法可以删除對象的屬性。

js 聲明——有無var的差別

使用var聲明的a變量無法删除,而b删除成功。

繼續閱讀