首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包实际上是什么时候创建的?

闭包实际上是什么时候创建的?
EN

Stack Overflow用户
提问于 2010-05-06 18:45:24
回答 5查看 2.3K关注 0票数 13

在以下情况下为foo创建闭包,但不为bar创建闭包,这是真的吗

案例1:

代码语言:javascript
复制
<script type="text/javascript">

    function foo() { }

</script>

foo是一个闭包,其作用域链仅包含全局作用域。

案例2:

代码语言:javascript
复制
<script type="text/javascript">

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

</script>

与情况1相同。

案例3:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<script type="text/javascript">

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

</script>

在这里,foo是一个仅具有全局作用域的闭包,但bar还不是一个闭包,因为在代码中没有调用函数foo,所以不会创建闭包bar。只有在调用foo时它才会存在,并且闭包bar将一直存在直到foo返回,然后闭包bar将被垃圾收集,因为在任何地方都没有对它的引用。

因此,当函数不存在,不能被调用,不能被引用时,那么闭包就不存在(还没有创建)。只有当函数可以被调用或可以被引用时,才会真正创建闭包?

EN

回答 5

Stack Overflow用户

发布于 2010-05-06 22:21:31

闭包是指一些函数代码中的自由变量被函数"context“绑定到一些值(闭包在这里是一个比context更恰当的术语)。

代码语言:javascript
复制
<script type="text/javascript">
    var i = 1;
    function foo() { return i; }
</script>

这里,对于foo的函数代码,i是一个自由变量。并且这个自由变量不会被任何现有的上下文(闭包)绑定到任何特定值。所以你没有任何闭包。

代码语言:javascript
复制
<script type="text/javascript">
    var i = 1;
    function foo() { return i; }
    foo(); // returns 1
    i = 2;
    foo(); // returns 2
</script>

现在,要创建一个闭包,您必须提供一个值绑定上下文:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<script type="text/javascript">

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

关于你的例子:

情况1不是一个闭包,它只是一个function

  • Case,2不是一个闭包,它是另一个有自由变量的函数,它不是一个闭包,它是另一个有特殊“variable

  • Case”this的函数。当函数作为对象的成员被调用时,该对象被赋值为this。否则,this的值就是全局对象。

  • Case 4不是一个闭包,它是一个定义在另一个函数中的函数。如果foo返回bar,您将创建一个仅包含'bar‘及其值的闭包:function bar() {}.
票数 9
EN

Stack Overflow用户

发布于 2010-05-06 18:48:41

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

是。

票数 1
EN

Stack Overflow用户

发布于 2010-05-21 08:59:58

在这些示例中,都没有创建闭包。

第二种方法是,如果你实际创建了一个函数并用它做了一些事情,那么就会创建一个闭包,现在你只需创建一个函数,然后丢弃它。与添加一行3+8;相同,您可以创建一个数字,然后将其丢弃。

闭包是一个简单的函数,它在主体中引用其创建环境中的变量,一个典型的例子是加法器:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2780428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档