search

Home  >  Q&A  >  body text

一道关于Javascript变量作用域的面试题

    var a = 100;
    (function(){
        console.log(a);
        var a = 10;
    })();

输出的结果为何是undefined, 如何修改结果输出100?

ringa_leeringa_lee2897 days ago271

reply all(8)I'll reply

  • 天蓬老师

    天蓬老师2017-04-10 15:20:08

    这段代码其实是这样

    var a = 100;
    (function(){
        var a;
        console.log(a);
        a = 10;
    })();
    

    所以console.log(a)的时候JS引擎找到了作用域中的变量a,但是其值是undefined

    至于你想要让它输出100,那方法就多了去了,我提供个自己的

    var a = 100;
    (function(num){
        var a = num;
        console.log(a);
    })(a);
    

    把外部作用域的a的值通过参数传入函数中,然后打印出来。这其实挺有用的。

    另外说一下上面同学的第二个例子,这个例子其实不太好,因为有点混淆了。

    首先if,for之类的操作符不会创建一个私有的作用域

    if (true) {
        var b = 1000;
    }
    
    console.log(b);
    //1000,在外部也可以调用,实际上就是在全局的声明
    

    然后上面这个例子

    var a = 100;
    if(true){
        console.log(a);
        var a = 10;
    }
    

    其实就是

    var a = 100;
    console.log(a);
    var a = 10;
    

    感觉容易搞混。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:20:08

    结果为什么是undefined? 因为在console.log(a)时,function作用域里的a覆盖了上层作用域变量,而私有变量a没有初始化;

    (function(){
        //私有作用域
    })();
    

    如何输出100? 简单点的:

    var a = 100;
    (function(){
        var a = 100;
        console.log(a);
    })();
    

    刚看到也可以这样:

    var a = 100;
    if(true){
        console.log(a);
        var a = 10;
    }
    

    推荐看下这篇文章:http://www.cnblogs.com/silentjesse/p/4024536.html

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:20:08

    变量声明提升、立即执行函数充当块级作用域

    reply
    0
  • 迷茫

    迷茫2017-04-10 15:20:08

    undefined 是因为 变量提升的原因。
    输出100 最简单了 console.log(100);

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:20:08

    1.javascript变量声明提升(hoisting)

    2.注释 /* var a = 10 */; console.log(a) 是可以访问到上层作用域的 a 的。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:20:08

    那我也来一个答案,上面都说的很清楚了

      var a = 100;
        (function(a){
            console.log(a);
            var a = 10;
        })(a);
    

    reply
    0
  • PHPz

    PHPz2017-04-10 15:20:08

    曾经有人给我展示过这种奇葩的写法。按照那个人的说法,可以理解为javascript解释器对于声明变量的一个预加载机制。
    即解释器在执行代码前会先寻找var声明的变量并注册(并不会赋值),所以function里的var语句无论写在哪,都会第一句就执行。
    这也证明了将变量声明放在开始的重要性。
    我想楼主是要输出全局变量a的值

    var a = 100;
    (function(){
        console.log(a);
        a = 10;
        console.log(a);
    })();
    

    这样第一个a是100,第二个是10

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:20:08

    我觉着这样最简单:
    var a = 100;

    (function(){
        console.log(a);
        a = 10;
    })();
    

    输出的结果也是100

    reply
    0
  • Cancelreply