JavaScript中var关键字使用与否的区别
在全局作用域下使用var关键字
在全局作用域下声明变量都是全局对象的属性,与是否使用var关键字没有影响。
两者之间的区别在于var
声明的变量是不可删除的。
var a = "a";
b = "b";
console.log(delete a); //=>false
console.log(delete b); //=>true
通过Object.getOwnPropertyDescriptor
方法查看两者之间的区别。
var a = "a";
b = "b";
console.log(Object.getOwnPropertyDescriptor(this,'a'));
//Object {value: "b", writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(this,'b'));
//Object {value: "a", writable: true, enumerable: true, configurable: false}
console.log(Object.getOwnPropertyDescriptor(this,'a').configurable); //=>false
console.log(Object.getOwnPropertyDescriptor(this,'b').configurable); //=>true
从以上代码可以发现a
是不可配置的,也就是说var
声明的变量是可写可读但是无法删除的。
在函数作用域内使用var关键字
在函数作用域内使用var
关键字声明的变量是无法在函数外访问的。
function functionScope(){
var a = "in";
}
console.log(a);
//=>error: Uncaught ReferenceError: a is not defined(…)
var a ="out"
function functionScope(){
var a = "in";
console.log(a); //=>in
console.log(this.a); //=>out, 注意函数调用模式下this指向的是全局对象
}
functionScope();
console.log(a); //=>out
如果在函数作用于内不使用var
声明变量,则表达式只是一个赋值操作,如果全局对象中没有该属性则报错(undefined),否则更新全局变量取值。
function functionScope(){
a = "in";
}
console.log(a);
//=>error: Uncaught ReferenceError: a is not defined(…)
var a ="out"
function functionScope(){
a = "in";
console.log(a); //=>in
console.log(this.a); //=>in, 注意函数调用模式下this指向的是全局对象
}
functionScope();
console.log(a); //=>in, 注意执行functionScope函数后,全局变量a值已经更新为in
说明
可参考博客:http://www.cnblogs.com/sprying/p/3197196.html
代码修改自:[JavaScript: novice to ninja,99-100页 Scope]