在以下情况下为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将被垃圾收集,因为在任何地方都没有对它的引用。
因此,当函数不存在,不能被调用,不能被引用时,那么闭包就不存在(还没有创建)。只有当函数可以被调用或可以被引用时,才会真正创建闭包?
发布于 2010-05-06 22:21:31
闭包是指一些函数代码中的自由变量被函数"context“绑定到一些值(闭包在这里是一个比context更恰当的术语)。
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>这里,对于foo的函数代码,i是一个自由变量。并且这个自由变量不会被任何现有的上下文(闭包)绑定到任何特定值。所以你没有任何闭包。
<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不是一个闭包,它只是一个function
this的函数。当函数作为对象的成员被调用时,该对象被赋值为this。否则,this的值就是全局对象。
foo返回bar,您将创建一个仅包含'bar‘及其值的闭包:function bar() {}.发布于 2010-05-06 18:48:41
关闭栏将一直存在,直到foo返回,然后关闭栏将被垃圾收集,因为在任何地方都没有对它的引用
是。
发布于 2010-05-21 08:59:58
在这些示例中,都没有创建闭包。
第二种方法是,如果你实际创建了一个函数并用它做了一些事情,那么就会创建一个闭包,现在你只需创建一个函数,然后丢弃它。与添加一行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); //3https://stackoverflow.com/questions/2780428
复制相似问题