在JS中声明时用"var"与不用"var"到底是什么区别

第一点:带var的有变量提升,而不带var的没有变量提升,这个我理解,还有一个网上说 不加var它并不是声明了一个全局变量,而是创建了一个全局对象的属性。那加上var是声明了全局变量 那全局变量和全局对象的属性有什么不同吗

阅读 6.2k
4 个回答

发现很多回答都集中在为什么使用var,并没有注意你关心的部分:

[全局变量和全局对象的属性有什么区别]

  1. ES5中,全局变量和全局对象的属性是等价的,因此,全局对象的属性赋值与全局变量的赋值也是等价的。
  2. ES6中 varfunction声明的全局变量,依旧是全局对象的属性,而letconst命令声明的全局变量,不属于全局对象的属性。全局对象的属性将与全局变量脱钩。

其实我觉得var声明最必要的部分应该是 使用var声明的变量是当前作用域,而不使用直接添加到全局变量(ES5中也是全局对象属性),这才是最关键的部分。(个人观点,且上面1,2点是对你疑惑的解答)

[更新]

关于为什么let和const不会覆盖掉window的属性,NICHOLAS进行了比较详细的说明,引用如下图:

clipboard.png

在不同的情景下使用 var 与不使用 var 区别都不一样;

比如在严格模式下不使用var关键词:

"use strict"
a = 1 // -> Uncaught ReferenceError: a is not defined; 此处直接报错

在严格模式下使用关键词 var

"use strict"
var a = 1;
a // -> 1

在非严格模式下不使用关键词 var:

b = 1;
b // -> 1

在非严格模式下使用关键词 var:

var b = 1;
b // -> 1

这些只是直观显式的表现, 还有一些, 比如不使用关键词var会往作用域外寻找同名变量,
种种这些, 需要多写代码 , 多练多想

window变量的属性可以用delete删除,但是全局变量不行

var a = 3;
delete window.a;  //false

window.b=3;
delete window.b;  //true

强烈建议,所有的变量都用var声明之后再使用,不然有时候忘了,就会找半天bug。


记错了,对window的自定义属性使用delete运算符,会返回false而不是报错,已更改答案。

全局变量就是在整个作用域都能够被访问到啊,对于两者之间的不同的话,可能就是楼上所说的delete之后的返回值不同。但是我一直都是用let来声明变量,因为它不会造成变量提升

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题