实际上是否创建了一个闭包?
这是真的,一个是封闭在下列情况下为创建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>
这里, 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>
总之,除非函数返回另一个函数,否则不能有闭包。 在这种情况下,返回的函数在退出时具有返回函数中存在的所有可变值绑定。
<script type="text/javascript">
function bar() {
var i = 1;
function foo() { return i; }
i = 2;
return foo;
}
bar()(); // returns 2
</script>
关于你的例子:
this
。 当函数被调用为对象的成员时,该对象被赋值为this
的值。 否则,值this
是全局对象。 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