zoukankan      html  css  js  c++  java
  • Hoisting(变量提升)

    var 和 let 的区别是什么?

    答案之一就有 let 不会变量提升

    那么,什么是变量提升?

    变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。 --MDN

    基本概念

    console.log(a);  // 输出 undefined
    var a = 1;
    

    这里使用var声明一个变量a,我们却能在声明之前使用,这里究竟发生了什么?
    原来,使用var声明一个变量的时候,不管你在哪里声明,执行程序的时候都会先将这个声明移动到作用域的最前面,而赋值操作则留在原处。
    以上代码可以看做

    var a;
    console.log(a);  // 输出 undefined
    a = 1;
    

    变量提升能否跨作用域

    foo()
    console.log(a)
    function foo() {
          var a = a
          console.log('foo')
    }
    

    执行结果

    a is not defined说明变量提升存在作用域
    这里发生了一个有趣的现象,我们在声明函数foo前调用了它,可以看出已经正常执行
    所以我们意外地得到一个结论,使用function声明函数存在整体的提升
    上面的代码等同于

    function foo() {
          var a = a
          console.log('foo')
    }
    foo()
    console.log(a)
    

    变量提升能否跨script标签

    <script>
    console.log(a);
    </script>
    <script>
    var a = 1;
    </script>
    

    执行结果

    结论 变量提升不能跨script

    var和function都存在提升,那么这个提升是否存在优先级

    console.log(a)
    var a = 1
    function a () {}
    console.log(a)
    

    执行结果

    函数整体提升了,然后给a重新赋值为1,所以先输出了函数

    console.log(a)
    function a () {}
    var a = 1
    console.log(a)
    

    执行结果

    没有发生变化,我得到的结论是function会整体提升,var只是声明一个变量,如果变量已存在则不会再次声明

    var声明函数变量不存在整体提升

    使用var声明只存在变量提升

    console.log(a)
    a()
    var a = funciton () {}
    

    执行结果

    变量提升只会声明一个值为undefined的变量

    无个性不签名
  • 相关阅读:
    省选模拟25
    有关树链剖分
    有关矩阵的一点讨论
    洛谷 P3390 【模板】矩阵快速幂
    HDU P2089
    有关动态规划(主要是数位DP)的一点讨论
    HDU P2222 Keywords Search
    普通平衡树Tyvj1728、luogu P3369 (treap)
    POJ P2104 K-th Number
    POJ 3311Hie with the Pie
  • 原文地址:https://www.cnblogs.com/qinweijie/p/14261048.html
Copyright © 2011-2022 走看看