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
,我知道该变量将被内部函数值重写,但我无法理解这种行为
答案 0 :(得分:5)
在第一个示例中,您创建了一个闭包 - 您创建的函数链接到bar
变量。它不作为参数传递给函数。当setInterval
稍后调用该函数而不提供任何参数时,它会按预期工作,因为该函数已关闭bar
变量。
在第二个示例中,您不会将变量作为参数传递。您描述了一个接受一个参数的函数,并且不会关闭任何参数。然后,setInterval
以相同的方式调用该函数,不提供任何参数。如果javascript中未提供参数,则该参数将变为undefined
。
(您可以使用任意数量的参数调用js中的函数,无论函数声明的参数是什么)。
关于闭包的更多阅读:How do JavaScript closures work?
答案 1 :(得分:1)
当调用回调时,setInterval不会调用参数,因此隐藏外部bar
的参数bar
为undefined
。
您可以将参数作为setInterval
的参数传递:
setInterval(function(bar) { console.log(bar); }, 1000, bar);