什么时候实际创建了一个闭包?

nop*_*ole 13 javascript closures

在以下情况下是否创建了闭包foo,但不适用于bar

情况1:

<script type="text/javascript">

    function foo() { }

</script>
Run Code Online (Sandbox Code Playgroud)

foo 是一个只有全局范围的范围链的闭包.

案例2:

<script type="text/javascript">

    var i = 1;
    function foo() { return i; }

</script>
Run Code Online (Sandbox Code Playgroud)

案例1相同.

案例3:

<script type="text/javascript">

    function Circle(r) {
        this.r = r;
    }
    Circle.prototype.foo = function() { return 3.1415 * this.r * this.r }

</script>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Circle.prototype.foo(返回圆的区域)指的是仅具有全局范围的闭包.(创建此闭包).

案例4:

<script type="text/javascript">

    function foo() { 
        function bar() { 
        }
    }

</script>
Run Code Online (Sandbox Code Playgroud)

这里,foo是一个只有全局范围bar的闭包,但不是闭包(因为),因为函数foo没有在代码中调用,因此不会bar创建任何闭包.只有在foo被调用时它才会存在,并且闭包bar将一直存在直到foo返回,然后闭包bar将被垃圾收集,因为在任何地方都没有引用它.

所以当函数不存在时,不能被调用,不能被引用,那么闭包还不存在(从未创建过).只有在可以调用或可以引用函数时,才会实际创建闭包?

Als*_*nde 8

闭包是当某些函数代码中的自由变量通过函数"context"绑定到某些值时(闭包是一个比上下文更合适的术语).

<script type="text/javascript">
    var i = 1;
    function foo() { return i; }
</script>
Run Code Online (Sandbox Code Playgroud)

这里i是函数代码的自由变量foo.并且此自由变量不受任何现有上下文(闭包)的任何特定值的约束.所以你没有任何关闭.

<script type="text/javascript">
    var i = 1;
    function foo() { return i; }
    foo(); // returns 1
    i = 2;
    foo(); // returns 2
</script>
Run Code Online (Sandbox Code Playgroud)

现在要创建一个闭包,你必须提供一个值限制上下文:

<script type="text/javascript">

    function bar() {
       var i = 1;
       function foo() { return i; }
       return foo;
    }
    bar(); // returns function foo() { return i; }
    bar()(); // returns 1
    // no way to change the value of the free variable i => bound => closure
</script>
Run Code Online (Sandbox Code Playgroud)

总之,除非函数返回另一个函数,否则不能有闭包.在这种情况下,返回的函数具有返回函数退出时存在的所有变量值绑定.

<script type="text/javascript">

    function bar() {
       var i = 1;
       function foo() { return i; }
       i = 2;
       return foo;
    }
    bar()(); // returns 2
</script>
Run Code Online (Sandbox Code Playgroud)

关于你的例子:

  1. 案例1不是一个闭包,它只是一个功能
  2. 情况2不是一个闭包,它是另一个带有自由变量的函数
  3. 案例3不是一个闭包,它是另一个具有特殊"变量"的函数this.当函数被调用为对象的成员时,该对象被赋值为this.否则,值为this全局对象.
  4. 情况4不是闭包,它是在另一个函数内定义的函数.应该foo返回bar,你将创建一个只包含'bar'及其值的闭包:function bar() {}.


Del*_*ani 1

闭包栏将一直存在,直到 foo 返回,然后闭包栏将被垃圾收集,因为在任何地方都没有对它的引用

是的。