JavaScript全局作用域下,变量加var和不加var的区别。

全局作用域下变量加var和不加var的区别

页面导航


第一个区别:不加var的变量名没有赋值输出会报错

第二个区别:加var的变量即是window的属性又是全局变量

第三个区别:delete只能删掉window下的属性




第一个区别

如果变量名在全局作用域下不加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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值