博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript全局作用域下,变量加var和不加var的区别。
阅读量:5924 次
发布时间:2019-06-19

本文共 1241 字,大约阅读时间需要 4 分钟。

全局作用域下变量加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。

转载地址:http://sgivx.baihongyu.com/

你可能感兴趣的文章
Fsutil文件的具体用法
查看>>
linux 笔记本的温度提示
查看>>
【转载】nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
查看>>
项目管理实践教程
查看>>
(转)DOTA新版地图6.78发布:大幅改动 增两位新英雄
查看>>
合成模式
查看>>
Primefaces框架开发杂谈!
查看>>
《scp 备份站点 笔记》连带邮件提醒
查看>>
Solaris 10u11 安装python2.7.10
查看>>
常用端口号大全(详细)
查看>>
我的友情链接
查看>>
工欲善其事必先利其器SecureCRT+VMware® Workstation_学习笔记
查看>>
文件和目录权限chmod,更改所有者和所属组chown,umask,隐藏权限lsattr/chattr
查看>>
阿里PB级Kubernetes日志平台建设实践
查看>>
怎么把无线由器限
查看>>
Java实现的冒泡排序
查看>>
APP中的第三方“支付”功能该如何测试
查看>>
HDU 1907
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>