实际上是否创建了一个闭包?

这是真的,一个是封闭在下列情况下为创建foo ,但不适合bar

情况1:

<script type="text/javascript">

    function foo() { }

</script>

foo是一个仅具有全局范围的范围链的闭包。

案例2:

<script type="text/javascript">

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

</script>

与案例1相同。

案例3:

<script type="text/javascript">

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

</script>

在这种情况下, Circle.prototype.foo (它返回圆的区域)引用只有全局作用域的闭包。 (这个封闭被创建)。

案例4:

<script type="text/javascript">

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

</script>

在这里, foo仅与全球范围内的关闭,但bar不是一个封闭(还),因为函数foo没有在代码中调用,所以没有关闭bar是不断创造。 如果它只会存在foo调用,并关闭bar会一直存在,直到foo回报,并关闭bar将被垃圾回收,因为有它没有提到在所有的任何地方。

所以当函数不存在时,不能被调用,不能被引用,那么闭包还不存在(从来没有创建过)。 只有当函数可以被调用或者可以被引用时,那么闭包实际上是被创建的?


闭包是当某些函数代码中的自由变量被函数“context”绑定到某些值时(闭包在这里是一个比上下文更合适的术语)。

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

这里, ifoo的函数代码的一个自由变量。 这个自由变量不受任何现有上下文(闭包)的任何特定值限制。 所以你没有任何关闭。

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

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

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

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

<script type="text/javascript">

    function bar() {
       var i = 1;
       function foo() { return i; }
       i = 2;
       return foo;
    }
    bar()(); // returns 2
</script>

关于你的例子:

  • 案例1不是封闭式的,它只是一个功能
  • 情况2不是闭包,它是另一个带有自由变量的函数
  • 案例三是不封闭,它与特殊的“变量”另一个功能this 。 当函数被调用为对象的成员时,该对象被赋值为this的值。 否则,值this是全局对象。
  • 情况4不是闭包,它是另一个函数中定义的函数。 如果foo返回bar ,你将创建一个只包含'bar'和它的值: function bar() {}的闭包。

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

    是。


    在这些例子中都没有创建封闭。

    第二个会创建一个闭包,如果你真的创建了一个函数并对它做了一些操作,现在只需创建一个函数然后将其扔掉。 与添加一行3+8; ,你创建一个数字,然后把它扔掉。

    闭包只是一个函数,它在其体内引用了其创建环境中的变量,典型示例是一个加法器:

    function createAdder(x) { //this is not a closure
        return function(y) { //this function is the closure however, it closes over the x.
            return y + x;
        }
    } //thus createAdder returns a closure, it's closed over the argument we put into createAdder
    
    var addTwo = createAdder(2);
    
    addTwo(3); //3
    
    链接地址: http://www.djcxy.com/p/51591.html

    上一篇: When actually is a closure created?

    下一篇: Discrete Anonymous methods sharing a class?