nop*_*ole 13 javascript closures
在以下情况下是否创建了闭包foo,但不适用于bar?
情况1:
<script type="text/javascript">
function foo() { }
</script>
Run Code Online (Sandbox Code Playgroud)
foo 是一个只有全局范围的范围链的闭包.
案例2:
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>
Run Code Online (Sandbox Code Playgroud)
案例1相同.
案例3:
<script type="text/javascript">
function Circle(r) {
this.r = r;
}
Circle.prototype.foo = function() { return 3.1415 * this.r * this.r }
</script>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Circle.prototype.foo(返回圆的区域)指的是仅具有全局范围的闭包.(创建此闭包).
案例4:
<script type="text/javascript">
function foo() {
function bar() {
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
这里,foo是一个只有全局范围bar的闭包,但不是闭包(因为),因为函数foo没有在代码中调用,因此不会bar创建任何闭包.只有在foo被调用时它才会存在,并且闭包bar将一直存在直到foo返回,然后闭包bar将被垃圾收集,因为在任何地方都没有引用它.
所以当函数不存在时,不能被调用,不能被引用,那么闭包还不存在(从未创建过).只有在可以调用或可以引用函数时,才会实际创建闭包?
闭包是当某些函数代码中的自由变量通过函数"context"绑定到某些值时(闭包是一个比上下文更合适的术语).
<script type="text/javascript">
var i = 1;
function foo() { return i; }
</script>
Run Code Online (Sandbox Code Playgroud)
这里i是函数代码的自由变量foo.并且此自由变量不受任何现有上下文(闭包)的任何特定值的约束.所以你没有任何关闭.
<script type="text/javascript">
var i = 1;
function foo() { return i; }
foo(); // returns 1
i = 2;
foo(); // returns 2
</script>
Run Code Online (Sandbox Code Playgroud)
现在要创建一个闭包,你必须提供一个值限制上下文:
<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>
Run Code Online (Sandbox Code Playgroud)
总之,除非函数返回另一个函数,否则不能有闭包.在这种情况下,返回的函数具有返回函数退出时存在的所有变量值绑定.
<script type="text/javascript">
function bar() {
var i = 1;
function foo() { return i; }
i = 2;
return foo;
}
bar()(); // returns 2
</script>
Run Code Online (Sandbox Code Playgroud)
关于你的例子:
this.当函数被调用为对象的成员时,该对象被赋值为this.否则,值为this全局对象.foo返回bar,你将创建一个只包含'bar'及其值的闭包:function bar() {}.