搜索

首页  >  问答  >  正文

html - javascript 变量作用域

代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>var a = 1;

 

function demo() {

 

   console.log(a); //undefined

 

   var a = 2;

 

   console.log(a); // 2

 

}

 

demo();

</code>

为什么第一个是 undefined 第二个是 2 ?

PHPzPHPz2910 天前734

全部回复(5)我来回复

  • 阿神

    阿神2017-04-10 14:49:57

    因为这一句:

    1

    2

    <code>var a = 2;

    </code>

    JavaScript 函数里的 var 声明执行时会被提升到函数的顶端,也就是说最终执行的代码不是:

    1

    2

    3

    4

    <code>console.log(a);

    var a;

    a = 2;

    </code>

    而是:

    1

    2

    3

    4

    <code>var a; // 这里的声明将外部作用域中的 a 声明覆盖掉了

    console.log(a); // undefined

    a = 2;

    </code>

    把那个 var 去掉就正常了。


    文档:var hoisting

    回复
    0
  • PHPz

    PHPz2017-04-10 14:49:57

    你的代码等价于这个

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    <code>var a = 1;

     

    function demo() {

     

       var a = undefined;

     

       console.log(a); //undefined

     

       a = 2;

     

       console.log(a); // 2

     

    }

     

    demo();

    </code>

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-10 14:49:57

    因为demo里面也定义了a啊……变量声明语句会先执行……

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 14:49:57

    因为第二个函数会先从局部作用哉开始查找。

    回复
    0
  • 怪我咯

    怪我咯2017-04-10 14:49:57

    可以这么解释,因为js有个预编译的过程,会把变量声明和函数声明提前到当前上下文的最前面。

    回复
    0
  • 取消回复