对那里的所有javascript大师:为什么会发生这种情况?

时间:2011-04-17 13:13:39

标签: javascript closures

为什么这段代码:

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专家那里得到启发。

2 个答案:

答案 0 :(得分:4)

function answer(x) {
  function closure() {
    var x = x || 42;
    console.log(x);
  }
  closure();
}
answer(20);

将您定义的x作为局部变量封闭。这意味着它会从链上方的答案函数中隐藏参数x。由于您使用var语句声明x,因此默认为undefined

然后x || 42undefined || 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
  • 定义var undefined
  • 执行alert(x)
  • 'inside'分配给x