JavaScript中var关键字使用与否的区别
发布于 12小时前 作者 dandananddada 68 次浏览 来自 分享

在全局作用域下使用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]

回到顶部