最基本的 var 关键字是上下文的, 而不采用 var 是全局的这就不讨论了
"不管是使用 var 关键字 (在全局上下文) 还是不使用 var 关键字(在任何地方), 都可以声明一个变量". 这貌似一个错误的概念: 任何时候, 变量只能通过使用 var 关键字才能声明.
a = 10; 是一个赋值语句, 仅仅是给全局对象 Windows 创建了一个新属性(但它不是变量)."不是变量" 并不是说它不能被改变, 而是指它不符合 ECMAScript 规范中的变量概念, 所以它 "不是变量".
- alert(a); // undefined
- alert(b); // b is not defined -->报错 "b" 没有声明
- b = 10;
- var a = 20;
我们可以看到, 因为 "b" 不是一个变量, 所以在这个阶段根本就没有 "b","b" 将只在代码执行阶段才会出现(但是在我们这个例子里, 还没有到那就已经出错了).
让我们改变一下例子代码:
- alert(a); // undefined, 这个大家都知道,
- b = 10;
- alert(b); // 10, 代码执行阶段创建
- var a = 20;
- alert(a); // 20, 代码执行阶段修改
其实就是变量声明提升的一个概念: 第一个例子相当于这个
- var a;
- alert(a); // undefined
- alert(b); // b is not defined -->报错 "b" 没有声明
- b = 10;
- a = 20;
关于变量, 还有一个特性就是不能用 delete 操作符直接删除变量属性.
- //Windows 的属性可以直接删除
- a = 10;
- alert(Windows.a); // 10
- alert(delete a); // true
- alert(Windows.a); // undefined
- // 变量不能被删除
- var b = 20;
- alert(Windows.b); // 20
- alert(delete b); // false
- alert(Windows.b); // still 20
但是这个规则在有个上下文里不起走样, 那就是 eval 上下文, 变量没有 {DontDelete} 特性.
- eval('var a = 10;');
- alert(Windows.a); // 10
- alert(delete a); // true
- alert(Windows.a); // undefined
来源: http://www.webhek.com/post/different-with-var-and-without-var.html