天天看点

js 声明——有无var的区别

在简单的一次尝试中发现了问题,上图:

图一:

js 声明——有无var的区别

图二:

js 声明——有无var的区别

这种情况发生的原因是什么呢?

有var的是已声明变量,没有var的是未声明变量。在MND的var词条中有这样的描述:

将赋值给未声明变量的值在执行赋值时将其隐式地创建为全局变量(它将成为全局对象的属性)。声明和未声明变量之间的差异是:

  1. 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。
  2. 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建。
  3. 声明变量是它所在上下文环境的不可配置属性,非声明变量是可配置的(如非声明变量可以被删除)。

我是否可以这样理解:未声明变量,即隐含全局变量,严格来说不是真正的变量,而是全局对象的属性。已声明变量是真正的变量,无法使用this访问或者删除。

再用一个例子验证我的想法:

js 声明——有无var的区别

delete方法可以删除对象的属性。

js 声明——有无var的区别

使用var声明的a变量无法删除,而b删除成功。

继续阅读