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

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

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

阅读 6.3k
8 个回答

这段代码其实是这样

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;

感觉容易搞混。

结果为什么是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

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

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

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

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

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

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

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

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

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

输出的结果也是100

推荐问题
logo
101 新手上路
子站问答
访问
宣传栏