这个函数是javascript中的一个闭包å—?

时间:2011-06-26 02:10:45

标签: javascript

    function f1(){
        var n=999;
        function f2(){
            alert(n); // 999
        }
    }

函数f2()是一个闭包å—?如果ä¸ï¼Ÿä¸ºä»€ä¹ˆå‘¢ï¼Ÿ

但在这篇文章中。 How do JavaScript closures work? 为什么会说:

function foo(x) {
  var tmp = 3;
  function bar(y) {
    alert(x + y + (++tmp));
  }
  bar(10);
}
foo(2)

è¿™ä¸æ˜¯ä¸€ä¸ªé—­åŒ…。一个闭包就是当你返回内部函数时。内部函数在离开之å‰ä¼šå…³é—­fooçš„å˜é‡ã€‚为什么?

但我ä¸çŸ¥é“我所åšçš„例å­å’Œæˆ‘引用的å¦ä¸€ä¸ªä¾‹å­æœ‰ä»€ä¹ˆä¸åŒï¼Œä¸€ä¸ªä¸æ˜¯å°é—­ã€‚但是一个是。我认为这两个例å­æ˜¯ä¸€æ ·çš„。

2 个答案:

答案 0 :(得分:3)

是的,f2是一个闭包,因为它从外部作用域访问å˜é‡ï¼ˆn)。 (好å§ï¼Œå®ƒä¸æ˜¯çœŸæ­£çš„关闭 - 请å‚阅下é¢çš„更新)。

n在f1内声明,而éžf2;这使它属于f1的范围。因此,当您创建引用f2的函数n时,根æ®å®šä¹‰å®ƒæ˜¯ä¸€ä¸ªé—­åŒ…,因为它使用其他人的å˜é‡ã€‚

<强>更新

好的,如果我ç†è§£æ‚¨å·²æ­£ç¡®é“¾æŽ¥çš„answer,则表示f2 ä¸æ˜¯ä¸€ä¸ªé—­åŒ…,因为它åªæ˜¯è®¿é—®ä¸€ä¸ªå˜é‡å®ƒçš„作用域(就åƒä¸€ä¸ªif语å¥ï¼Œå®ƒåœ¨å¤§æ‹¬å· * 中获得自己的作用域,å¯ä»¥ä½¿ç”¨å¤–部作用域中的å˜é‡è€Œä¸éœ€è¦é—­åŒ…。)

* 更新:原æ¥åªæœ‰å‡½æ•°åœ¨Javascript中获å–自己的范围,而ä¸æ˜¯ä»»ä½•æ—§å—。但我的观点ä»ç„¶å­˜åœ¨......

但是,如果f2 离开f1的范围(例如通过退回),f1 å°†æˆä¸ºã€‚在这ç§æƒ…况下,它ä»ç„¶å¯ä»¥è®¿é—®nå˜é‡f1,å³ä½¿f2的原始范围ä¸å†å­˜åœ¨ï¼ˆå®ƒï¼†ï¼ƒ39;当控制离开函数时退出)。 f1会关闭&#34; f1çš„å˜é‡ï¼Œå› æ­¤äººä¸ºåœ°å»¶é•¿äº†f2范围的生命周期。

就个人而言,å³ä½¿å®ƒæ°¸è¿œä¸ä¼šç¦»å¼€f1,我ä»ç„¶ä¼šå°†f2称为闭包。如果一个函数åªæ˜¯é€šè¿‡åœ¨å…¶å£°æ˜ŽèŒƒå›´ä¹‹å¤–使用而æˆä¸ºä¸€ä¸ªé—­åŒ…,并且它在该范围内的行为无论从技术上讲是å¦æ˜¯é—­åŒ…都没有区别,那么我认为没有æ„义在åšå‡ºåŒºåˆ†ã€‚我甚至会说,如果f1是å¦ä¸ºå°é—­ï¼Œå®ƒæ˜¯å¦æ˜¯ä¸€ä¸ªå®žçŽ°ç»†èŠ‚,如果它永远ä¸ä¼šç¦»å¼€{{1}}的范围。

å¦ä¸€æ–¹é¢ï¼Œå¿½ç•¥è¿™ç§åŒºåˆ«æ„味ç€ä»»ä½•ä½¿ç”¨å…¨å±€å˜é‡çš„函数都会被称为&#34; closure&#34;,因为它从外部作用域访问å˜é‡ã€‚因此,åªæœ‰å½“它离开其所使用的å˜é‡çš„范围时,它æ‰æˆä¸ºé—­åŒ…这一事实在中定义是一ç§æœ‰ä»·å€¼çš„(尽管是微妙的)区别。

我想我能给出的最明确的答案是它ä¸æ˜¯å…³é—­ 。

答案 1 :(得分:1)

它是一个闭包,因为它å–决于中间(å³éžå±€éƒ¨æˆ–全局)范围内的å˜é‡å€¼ï¼Œå¦‚æžœå˜é‡å‘生å˜åŒ–,那么闭包的æ“作也会å‘生å˜åŒ–。值总是相åŒçš„是å¶ç„¶çš„。

但是,您å¯èƒ½å¸Œæœ›å°†é—­åŒ…返回给f1()的调用者,以便å¯ä»¥åœ¨å…¶ä»–地方使用。