search

Home  >  Q&A  >  body text

html - javascript 变量作用域

代码如下

var a = 1;

function demo() {

   console.log(a); //undefined

   var a = 2;

   console.log(a); // 2

}

demo();

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

PHPzPHPz2902 days ago729

reply all(5)I'll reply

  • 阿神

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

    因为这一句:

    var a = 2;
    

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

    console.log(a);
    var a;
    a = 2;
    

    而是:

    var a; // 这里的声明将外部作用域中的 a 声明覆盖掉了
    console.log(a); // undefined
    a = 2;
    

    把那个 var 去掉就正常了。


    文档:var hoisting

    reply
    0
  • PHPz

    PHPz2017-04-10 14:49:57

    你的代码等价于这个

    var a = 1;
    
    function demo() {
    
       var a = undefined;
    
       console.log(a); //undefined
    
       a = 2;
    
       console.log(a); // 2
    
    }
    
    demo();
    

    reply
    0
  • 大家讲道理

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

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

    reply
    0
  • PHP中文网

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

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

    reply
    0
  • 怪我咯

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

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

    reply
    0
  • Cancelreply