第一点:带var的有变量提升,而不带var的没有变量提升,这个我理解,还有一个网上说 不加var它并不是声明了一个全局变量,而是创建了一个全局对象的属性。那加上var是声明了全局变量 那全局变量和全局对象的属性有什么不同吗
第一点:带var的有变量提升,而不带var的没有变量提升,这个我理解,还有一个网上说 不加var它并不是声明了一个全局变量,而是创建了一个全局对象的属性。那加上var是声明了全局变量 那全局变量和全局对象的属性有什么不同吗
在不同的情景下使用 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
来声明变量,因为它不会造成变量提升
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答873 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
发现很多回答都集中在为什么使用
var
,并没有注意你关心的部分:[全局变量和全局对象的属性有什么区别]
var
和function
声明的全局变量,依旧是全局对象的属性,而let
和const
命令声明的全局变量,不属于全局对象的属性。全局对象的属性将与全局变量脱钩。其实我觉得
var
声明最必要的部分应该是 使用var声明的变量是当前作用域,而不使用直接添加到全局变量(ES5中也是全局对象属性),这才是最关键的部分。(个人观点,且上面1,2点是对你疑惑的解答)[更新]
关于为什么let和const不会覆盖掉window的属性,
NICHOLAS
进行了比较详细的说明,引用如下图: