匿名函数和参数

时间:2013-06-16 11:19:53

标签: javascript performance

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,我知道该变量将被内部函数值重写,但我无法理解这种行为

2 个答案:

答案 0 :(得分:5)

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

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

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

关于闭包的更多阅读:How do JavaScript closures work?

答案 1 :(得分:1)

当调用回调时,setInterval不会调用参数,因此隐藏外部bar的参数barundefined

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

setInterval(function(bar) { console.log(bar); }, 1000, bar);