var
console.log(a) // undefined var a = 1
从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是声明。
对于这种情况,我们可以把代码这样来看
var a console.log(a) // undefined a = 1
接下来我们再来看一个例子
var a = 10 var a console.log(a)
对于这个例子,如果你认为打印的值为undefined那么就错了,答案应该是10,对于这种情况,我们这样来看代码 var a var a a = 10 console.log(a)
到这里为止,我们已经了解了var声明的变量会发生提升的情况,其实不仅变量会提升函数也会被提升。
console.log(a) // ƒ a() {} function a() {} var a = 1
对于上述代码,打印结果会是ƒ a() {},即使变量声明在函数之后,这也说明了函数会被提升,并且优先于变量提升。
说完了这些,想必大家也知道var存在的问题了,使用var声明的变量会被提升到作用域的顶部。
接下来我们再来看let
和const
var a = 1
let b = 1
const c = 1
console.log(window.b) // undefined
console.log(window. c) // undefined function test(){
console.log(a)
let a
}
test()
首先在全局作用域下使用let
和const
声明变量,变量并不会被挂载到window
上,这一点就和var
声明有了区别。
再者当我们在声明a
之前如果使用了a
,就会出现报错的情况, a is not defined
首先报错的原因是因为存在暂时性死区,我们不能在声明前就使用变量,这也是let
和const
优于var
的一点。然后这里你认为的提升和var
的提升是有区别的,虽然变量在编译的环节中被告知在这块作用域中可以访问,但是访问是受限制的
总结
- 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
-
var
存在提升,我们能在声明之前使用。let
、const
因为暂时性死区的原因,不能在声明前使用 -
var
在全局作用域下声明变量会导致变量挂载在window
上,其他两者不会 -
let
和const
作用基本一致,但是后者声明的变量不能再次赋值2019-03-02 19:28:08