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);