为什么这段代码:
function answer(x) {
function closure() {
var x = x || 42;
console.log(x);
}
closure();
}
foo();
始终打印42
?
逻辑是类似foo(31337)
的内容会打印31337
,因为在closure
x
中会31337
,所以x || 42
会评估为31337
。但事实并非如此。
我只是想不出来,所以我在这里张贴这个,希望能从那里真正的javascript专家那里得到启发。
答案 0 :(得分:4)
function answer(x) {
function closure() {
var x = x || 42;
console.log(x);
}
closure();
}
answer(20);
将您定义的x
作为局部变量封闭。这意味着它会从链上方的答案函数中隐藏参数x
。由于您使用var语句声明x
,因此默认为undefined
。
然后x || 42
是undefined || 42
,即42。
这里的问题是您使用相同的名称。如果您x = x || 42
x = 28 || 42
,则var
将x设置为28.
区别在于使用function() {
var x = 52;
foo();
function foo() {
...
}
}
语句创建名为x的新函数局部变量。完成后,无法引用范围链上较高的同名变量。
澄清口译员的工作方式。像这样:
function() {
function foo() {
}
var x;
x = 52;
foo();
}
转换为
{{1}}
答案 1 :(得分:3)
var x
中的 var x = x || 42;
会影响参数。
由于var ...
总是在函数的开头解析 - 即在执行赋值之前,外部x在那里永远不可用。
这是一个更好的例子:
(function(x) {
(function() {
alert(x);
var x = 'inside';
})();
})(123);
执行顺序基本上是:
x
undefined
alert(x)
'inside'
分配给x