变量提升是 JavaScript 中比较“奇怪”的现象,它允许在变量声明之前即被访问,
<script>
// 访问变量 str
console.log(str + 'world!');
// 声明变量 str
var str = 'hello ';
</script>
let和var都有提升,但是let定义的变量没有赋值之前是不可以使用、var可以使用是undefined
面试题:
var b = 100
function fn() {
console.log(b)
var b = 200
}
fn() // 结果是 undefined
面试题:
{
b = 3 // 声明变量的时候,没有加任何关键字
}
console.log(b) // 3
// 没有任何关键字声明的变量,这种变量相当于是全局变量
a = 1
function fn() {
a = 200 // 没有任何关键字,声明了变量,相当于是全局变量
}
fn()
console.log(a) // 200
面试题:
// 用let声明的变量也可以认为是有变量提升的;只不过在没有给变量赋值之前是不能使用的(使用就会报错)
// console.log(a)
// let a = 2
// -----------------------------------------------------
let b = 100
function fn() {
console.log(b) // 报错,因为会把下一行的b的声明提升到前面,提升后又没有初始值,还断绝了去外层作用域查找的机会
// 在变量提升后,一直到变量赋值之前,这个时间段叫做暂时性死区。这个时候不能使用变量
let b = 500
}
fn()
总结:
- 变量在未声明即被访问时会报语法错误
- 用var声明的变量在声明之前即被访问,变量的值为
undefined
- 用
let
声明的变量,在声明之前使用,就会报错 let
声明的变量不存在变量提升,推荐使用let
【也有人认为具有提升但是不赋值不能使用】- 变量提升出现在相同作用域当中
- 实际开发中推荐先声明再访问变量,必须的
注:关于变量提升的原理分析会涉及较为复杂的词法分析等知识,而开发中使用 let
可以轻松规避变量的提升,因此在此不做过多的探讨,有兴趣可查阅资料。