var a = 100;
(function(){
console.log(a);
var a = 10;
})();
输出的结果为何是undefined, 如何修改结果输出100?
天蓬老师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;
感觉容易搞混。
高洛峰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
PHP中文网2017-04-10 15:20:08
1.javascript变量声明提升(hoisting)
2.注释 /* var a = 10 */; console.log(a)
是可以访问到上层作用域的 a 的。
高洛峰2017-04-10 15:20:08
那我也来一个答案,上面都说的很清楚了
var a = 100;
(function(a){
console.log(a);
var a = 10;
})(a);
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
黄舟2017-04-10 15:20:08
我觉着这样最简单:
var a = 100;
(function(){
console.log(a);
a = 10;
})();
输出的结果也是100