1
function foo() {
    var bar = 'no'
    setInterval(function() { console.log(bar); }, 1000);
}

当我执行这段代码时,我得到了以下输出:no,所以输出是正确的。但是当我执行下一段代码时,当我将函数bar作为参数传递给那个匿名函数时,我不知道为什么输出是undefined

function foo() {
    var bar = 'no'
    setInterval(function(bar) { console.log(bar); }, 1000);
}

如果我将变量作为参数传递,为什么未定义?如果匿名函数内部也有变量调用bar,我知道该变量将被内部函数值重写,但我无法理解这种行为

4

2 回答 2

5

在您的第一个示例中,您创建了一个闭包——您创建的函数链接到bar变量。它不会作为参数传递给函数。当setInterval稍后在不提供任何参数的情况下调用该函数时,它会按预期工作,因为该函数已关闭bar变量。

在第二个示例中,您没有将变量作为参数传递。你描述了一个接受一个参数的函数,并且没有关闭任何东西。然后稍后setInterval以相同的方式调用该函数,不提供任何参数。如果 javascript 中未提供参数,则它变为undefined.

(您可以在 js 中使用任意数量的参数调用函数,而不管函数声明的参数是什么)。

更多关于闭包的阅读:JavaScript 闭包是如何工作的?

于 2013-06-16T11:21:43.690 回答
1

调用回调时,通过setIntervalbar不带参数地调用它,因此遮蔽外部的参数barundefined

您可以将参数作为参数传递setInterval

setInterval(function(bar) { console.log(bar); }, 1000, bar);
于 2013-06-16T11:23:24.103 回答