以下情况是否会创建闭包foo
,但不适合bar
?
Case 1:
<script type="text/javascript">
function foo() { }
</script>
foo
是一个带有仅具有全局作用域的作用域链的闭包。
Case 2:
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>
与案例1相同。
Case 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
(返回圆的面积)指的是仅具有全局范围的闭包。 (这个闭包被创建)。
Case 4:
<script type="text/javascript">
function foo() {
function bar() {
}
}
</script>
here, foo
是一个仅具有全局范围的闭包,但是bar
还不是闭包,因为该函数foo
代码中没有调用,所以没有闭包bar
曾经被创造过。它只会存在,如果foo
被调用,并且闭包bar
将存在直到foo
返回,并关闭bar
然后将被垃圾收集,因为在任何地方都没有引用它。
因此,当函数不存在、无法调用、无法引用时,闭包还不存在(尚未创建)。只有当函数可以被调用或者可以被引用时,才真正创建了闭包?
闭包是指某些函数代码中的自由变量通过函数“上下文”绑定到某些值(闭包在这里是比上下文更合适的术语)。
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>
Here, i
是函数代码的自由变量foo
。并且这个自由变量不被任何现有上下文(闭包)绑定到任何特定值。所以你没有任何关闭。
<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>
总之,除非一个函数返回另一个函数,否则不能有闭包。在这种情况下,returned函数具有存在于的所有变量值绑定返回当它起作用时exited.
<script type="text/javascript">
function bar() {
var i = 1;
function foo() { return i; }
i = 2;
return foo;
}
bar()(); // returns 2
</script>
关于你的例子:
- 情况 1 不是一个闭包,它只是一个函数
- 情况 2 不是一个闭包,它是另一个带有自由变量的函数
- 情况 3 不是一个闭包,它是另一个具有特殊“变量”的函数
this
。当函数作为对象的成员被调用时,该对象被分配给this
。否则,值this
是全局对象。
- 情况 4 不是闭包,它是在另一个函数内定义的函数。应该
foo
return bar
,您将创建一个仅包含“bar”及其值的闭包:function bar() {}
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)