这个函数是javascript中的闭包吗

is this function a closure in javascript?

本文关键字:闭包 javascript 函数      更新时间:2023-09-26
    function f1(){
        var n=999;
        function f2(){
            alert(n); // 999
        }
    }

函数f2()是闭包吗?如果没有?为什么?

但在这篇文章中。JavaScript闭包是如何工作的?为什么说:

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

这不是一个结束。闭包是指返回内部函数。内部函数将在离开之前关闭foo的变量为什么?

但是我不知道我做的这个例子和我引用的另一个例子有什么区别,一个不是闭包。但一个是。我认为这两个例子是一样的。

是的,f2是一个闭包,因为它从外部作用域访问变量(n(。(好吧,这并不是真正的结束——请参阅下面的更新(。

n是在f1内部声明的,而不是在f2内部声明的;这使得它属于CCD_ 7的范围。因此,当您创建引用n的函数f2时,根据定义,它是一个闭包,因为它使用了其他人的变量。

更新

好吧,如果我正确理解了你链接到的答案,它说f2而不是闭包,因为它只是访问其范围内的变量(就像if语句一样,它在大括号*内获得自己的范围,可以使用外部范围的变量,而不需要闭包(。

*更新:发现只有函数在Javascript中有自己的作用域,而不是任何旧块。但我的观点仍然有效

然而,如果f2离开了f1的作用域(例如被返回(,它将变成闭包;在这种情况下,它仍然可以访问f1的变量n,即使f1的原始作用域将不复存在(当控件离开函数时,它将退出(。f2会"封闭"f1的变量,从而人为地延长f1的作用域的寿命。

就我个人而言,我仍然会称f2为闭包,即使它从未离开f1。如果一个函数只需在其声明范围之外使用,就可以成为闭包,并且无论它在技术上是否是闭包,它在该范围内的行为都没有什么不同,那么我认为没有必要进行区分。我甚至可以说,无论f2是否是闭包,如果它从未离开f1的范围,这都是一个实现细节。

另一方面,忽略这种区别意味着任何使用全局变量的函数都将被称为"闭包",因为它从外部范围访问变量。因此,只有当它离开中定义的变量的范围时,它才成为闭包,这是一个有价值的(尽管很微妙(区别。

我想我能给出的最清楚的答案是这还不是一个闭包

它是一个闭包,因为它取决于中间(即不是局部或全局(范围中变量的值,如果变量发生变化,那么闭包的操作也会发生变化。价值总是相同是偶然的。

但是,您可能希望将闭包返回给f1()的调用者,以便在其他地方使用它。