一道关于Javascript变量作用域的面试题
ringa_lee
ringa_lee 2017-04-10 15:18:08
[JavaScript讨论组]
    var a = 100;
    (function(){
        console.log(a);
        var a = 10;
    })();

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

ringa_lee
ringa_lee

ringa_lee

全部回复(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

PHP中文网

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

迷茫

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

PHP中文网

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

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

高洛峰

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

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

曾经有人给我展示过这种奇葩的写法。按照那个人的说法,可以理解为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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号