匿å函数和å‚æ•°

时间: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çš„å‚æ•°bar为undefined。

您å¯ä»¥å°†å‚数作为setIntervalçš„å‚数传递:

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