var关键字的使用

首先我们来看一段代码

var a = 1
b = 2

console.log(a)  //1
console.log(b)  //2

我们可以看到a, b都能被正常的输出。区别只是在于a前边有个“var”关键字,而b没有,不过从结果上看似乎并没有什么区别,那到底“var”关键字有什么用呢?再来看下一段代码。

function foo(){
    var a = 1
    b = 2
}

console.log(a)  //a is not defined
console.log(b)  //2

从上面的代码我们可以看出在函数中使用“var”关键字定义的变量a在输出时出错,提示未定义。而b却被正常输出了。

对比两段代码,区别仅在于在后面一段的代码中,a,b被定义在了一个函数体内。而从错误提示中可以看出,使用了“var”关键字且被定义在函数内的a变量在函数外部无法被访问。事实上,“var”关键字起到的作用时在当前作用域内声明变量。换句话说,如果在方法内使用则是声明了一个局部变量,在全局域内声明则是声明了一个全局变量。

那么,没有使用“var”关键字的那个b为什么无论定义在外部还是函数内都可以被访问到呢?难道它是全局变量么?可是不是说“使用‘var’关键字在全局域中声明的变量才是全局变量么?”

var a = 1
b = 2

console.log(b)  //2
console.log(window.b)  //2
console.log(window)  //Window{....., b: 2}

从这段代码中可以看出我们定义的b变量出现在了window对象下并成为了它的一个属性。解释器在读到这一句时会从当前的作用域链寻找是否已经存在b这个变量,如果存在则修改它的值为2,若不存在则在作用域链的最顶层对象,如window对象下创建b属性并赋值2。所以在现在这种情况下,b并不是一个变量而是window对象的一个属性。

看起来似乎全局变量和全局对象的属性并没有什么区别,事实上,区别在于变量具有“不可删除性”,而对象属性是可以被删除的。

var a = 1
b= 2

console.log(a)  //1
console.log(b)  //2

delete a
delete b

console.log(a)  //1
console.log(b)  //b is not defined

猜你喜欢

转载自blog.csdn.net/hjc256/article/details/80825432
今日推荐