全局作用域下变量加var和不加var的区别
页面导航
如果变量名在全局作用域下不加var,则浏览器不会对这个变量进行预解析。
如果没有给变量名加var,也没有给这个变量赋值,那么在console.log()输出时会报错。而给变量名加了var的变量,即使不赋值,console.log()是能输出的,只是输出结果是undefined而已。
看如下代码和结果:
(不加var的变量名a,输出会直接报错,报错后不执行后面的操作)
浏览器输出的结果是:
所以,如果在全局作用域下不给变量名加var,同时也不赋值,就进行console.log的操作就会报错。
在JavaScript中,上一行代码报错了,则下一行代码是不会执行的,所以后续并没有执行console.log(b)的操作。
那么我们现在把上面的代码换一个顺序,如下图:
(变量名加了var后,即使不赋值,也是可以输出的,只是输出结果是undefined)
在浏览器中显示的结果为:
如果变量名不加var: 但是给变量赋值了,那么就是给window增加了一个属性名和属性值。例如:
a=12;其实是window.a=12;
不加var的变量,如果赋值了就是给window添加了一个属性。
如果变量名加了var: 不仅仅是给window加了一个属性名和值,同时也定义了一个全局变量。
所以说加var的变量会有两种效果,一种是window的属性,一种是全局变量。
根据浏览器的执行顺序:
如果浏览器遇到变量,会先从全局变量下查找是否存在。如果不存在,再到window的属性名里查找。如果都不存在,则会报错。
例如:console.log(a); a既不是全局也不是window属性所以输出时会报错。
如下代码,说明不加var变量名赋值后是window的属性
( c变量名没有加var,但是赋值了,所以c是window的属性,浏览器解析不是全局变量后,会到window的属性名下查找,如果能找到就会输出):
输出结果为:
所以,没有加var的变量,赋值后这个变量就是window的属性了。
不加var的属性赋值后就是window下的属性。如果是window下的属性,那么用delete关键字就可以删除这个属性。如果是全局变量下的属性,那么使用window的关键字是无法删除的。
例如:
(delete 把c删除后,window下就没有这个属性了,那么你要输出它就会报错)
浏览器输出的结果是:
如果属性加了var,那么这个属性即是window下的,同时又是全局属性。而delete关键字只能删除window下的属性,不能删除全局作用域下的属性。如下图:
(c变量加了var后,即是用delete删除也是删除在window下的属性,则全局下是不会被删除的)
浏览器输出的结果是:
所以,加了var的变量delete是无法删除的。
为了避免是属性的作用域出现混淆,所以建议以后只要是变量就都加一个var。