在函数中用var声明一个局部变量,只在函数内可以访问,在函数外是无法访问的。当不用var声明,直接初始化变量时,变量会被添加到全局执行环境中,当函数执行完之后,依旧可以在函数外访问变量。

1
2
3
4
5
6
7
function plus() {
var a = 1;
b = 1;
}
plus();
console.log(a); // => undefined
console.log(b); // => 1

以上是理解并没有什么问题。但有种说法:

在函数中不用var声明变量会声明一个全局变量.

这种说法是错误的,错误的!

没有使用var声明,这根本就没有声明一个变量,而是直接赋值。为什么能直接赋值?先看个例子:

1
2
3
var obj = {
}
obj.a = 1;

上面例子中,直接给对象obj添加属性a,并赋值1;
而没有var声明的变量,也是这个原理。

在函数中没有var声明就直接给变量赋值,就是给window对象添加属性,属性名就是变量名。

这种方式得到的window属性是可以用delete删除的。用var在全局作用域声明变量,会当做全局对象的属性。但var 声明的变量是无法用delete删除的。