变量提升是 JavaScript 中比较“奇怪”的现象,它允许在变量声明之前即被访问,

    1. <script>
    2. // 访问变量 str
    3. console.log(str + 'world!');
    4. // 声明变量 str
    5. var str = 'hello ';
    6. </script>
    7. letvar都有提升,但是let定义的变量没有赋值之前是不可以使用、var可以使用是undefined

    面试题:

    1. var b = 100
    2. function fn() {
    3. console.log(b)
    4. var b = 200
    5. }
    6. fn() // 结果是 undefined

    面试题:

    1. {
    2. b = 3 // 声明变量的时候,没有加任何关键字
    3. }
    4. console.log(b) // 3
    5. // 没有任何关键字声明的变量,这种变量相当于是全局变量
    6. a = 1
    7. function fn() {
    8. a = 200 // 没有任何关键字,声明了变量,相当于是全局变量
    9. }
    10. fn()
    11. console.log(a) // 200

    面试题:

    1. // 用let声明的变量也可以认为是有变量提升的;只不过在没有给变量赋值之前是不能使用的(使用就会报错)
    2. // console.log(a)
    3. // let a = 2
    4. // -----------------------------------------------------
    5. let b = 100
    6. function fn() {
    7. console.log(b) // 报错,因为会把下一行的b的声明提升到前面,提升后又没有初始值,还断绝了去外层作用域查找的机会
    8. // 在变量提升后,一直到变量赋值之前,这个时间段叫做暂时性死区。这个时候不能使用变量
    9. let b = 500
    10. }
    11. fn()

    总结:

    1. 变量在未声明即被访问时会报语法错误
    2. 用var声明的变量在声明之前即被访问,变量的值为 undefined
    3. let声明的变量,在声明之前使用,就会报错
    4. let 声明的变量不存在变量提升,推荐使用 let【也有人认为具有提升但是不赋值不能使用】
    5. 变量提升出现在相同作用域当中
    6. 实际开发中推荐先声明再访问变量,必须的

    注:关于变量提升的原理分析会涉及较为复杂的词法分析等知识,而开发中使用 let 可以轻松规避变量的提升,因此在此不做过多的探讨,有兴趣可查阅资料