“闭包”究竟在JavaScript中提到了什么?

我明白什么是封闭,但我在closure术语所指的术语方面遇到了一些麻烦。 我在许多网站上看到了这个术语,但他们很少就它的实际定义达成一致。

  • 它是保留在堆栈帧的变量吗?
  • 它是被返回的函数吗?
  • 它是外部函数的范围吗?
  • 它是内部(返回)函数的范围吗?
  • 这可能是在返回函数后将变量保留在栈帧上的概念吗?
  • 有人能准确地告诉我什么closure是指?


    来自JavaScript闭包

    两个一句话总结:

    闭包是函数的局部变量 - 在函数返回后保持活动状态,或

    闭包是当函数返回时不会释放的栈帧。 (就好像一个'栈框架'被malloc',而不是在堆栈上!)

    关于关闭的一篇非常好的文章

    Javascript关闭

    “闭包”是一个表达式(通常是一个函数),可以将自由变量与一个绑定这些变量的环境(即“关闭”表达式)一起使用。

    关于Closure的简单解释是ECMAScript允许内部函数; 函数定义和函数表达式在其他函数的函数体内。 而且这些内部函数允许访问其外部函数中的所有局部变量,参数和声明的内部函数。 当这些内部函数之一在包含它的函数之外被访问时形成闭包,以便它可以在外函数返回之后执行。 在此时它仍然可以访问其外部函数的局部变量,参数和内部函数声明。 那些局部变量,参数和函数声明(最初)具有它们在外部函数返回时可能具有的值,并且可以与内部函数交互。

    这是一个很好的例子

    JavaScript,时间来关闭闭包


    它是一个函数,可以“持有”另一个范围内的引用或引用。 例如:

    var myArrayOfFunctions = [];
    
    for(var i = 0; i<3: i++)
    {
        //Note how the function being defined uses i, 
        //where i lives in the parent's scope, this creates a closure
        myArrayOfFunctions[i] = function(a) { return a + i;}    
    }
    
    myArrayOfFunctions[0](5);   //Prints 8 WTF!
    myArrayOfFunctions[1](5);   //8 again
    myArrayOfFunctions[2](5);   //Well, this 8 was expected
    

    发生这种情况是因为当函数被“创建”时,它们不会复制我的值,它们持有对i的引用,所以当我们调用函数时,它们使用i的当前值3。

    这是一个图形解释。


    对我来说,JS中的关闭允许你做以下事情。
    当添加到“b”中时,内部函数仍然可以使用“a”,尽管它在外部声明。

    function adder(a){
      return function(b){
        return a + b;
      };
    }
    var add5 = adder(5);
    alert( add5(10) );
    

    对于JS闭包的极端使用,你可以看一下PURE库的源代码(一个JS模板引擎)

    链接地址: http://www.djcxy.com/p/51609.html

    上一篇: What exactly does "closure" refer to in JavaScript?

    下一篇: setTimeout or setInterval?