var、let、const 的区别
2019-12-18 本文已影响0人
行走的蛋白质
- 什么是提升,什么是暂时性死区,var、let、const的区别?
提升 hoisting
- 提升示例 1
console.log(num1) // undefined
var num1 = 1
console.log(num2) // 抛错
let num2 = 2
如上述示例:num1还没有被声明,但是我们可以使用它,这种情况就是变量提升。var 可以 let 不可以。
上述 var 声明变量等同于如下写法:
var num1
console.log(num1) // undefined
num1 = 1
- 提升示例 2
var num1 = 666
var num1
console.log(num1)
上述示例打印结果并不是 undefined 而是 666,变形如下:
var num1
var num1
num1 = 666
console.log(num1) // 666
- 提升示例 3
console.log(fun1) // function() {}
function fun1() {
}
var fun1 = 2
console.log(fun1) // 2
上述示例说明函数也会提升,并且优于变量提升。
- 提升示例 4
var num1 = 1
let num2 = 2
const num3 = 3
console.log(window.num1) // 1
console.log(window.num2) // undefined
console.log(window.num3) // undefined
function fun1() {
console.log(num1) // 抛错
let num1
}
fun1()
上述示例说明由 let 和 const 声明的变量并不会挂载到 window 上面,区别于 var
如果一个变量在声明前被使用就会报错原因就是由 let 和 const 声明的变量存在暂时性死区
- 提升存在的意义:解决函数间相互调用的情况,如下示例:
function fun1() {
fun2()
}
function fun2() {
fun1()
}
fun1()
如果不存在提升,就不会存在 fun1 在 fun2 前面的同时 fun2 又在 fun1 前面的情况。
小结:
- 函数提升优于变量提升,函数提升会把整个函数移到作用域的顶部,变量提升只会把声明移到作用域的顶部。
- var 存在提升,我们能在声明之前使用;let、const 因为暂时性死区的原因不能在声明之前使用。
- var 在全局声明变量会被挂载到 window 上面,let、const 不会。
- let 和 const 作用基本一致,但 const 声明的变量值不允许改变。