function Foo(){ var i=0; return function(){ document.write(i++); } } var f1=Foo(), f2=Foo(); f1(); f1(); f2();
请问以上程序的输出是
function Foo() { // 由于闭包的存在,i 所在的上下文环境不会被释放掉 var i = 0 // 在函数中定义了一个函数,这里相当于实现了一个闭包 return function () { document.write(i++) // 这里的 i++ 表示:先打印 i ,然后 i = i + 1 } } var f1 = Foo(), f2 = Foo() // f1 打印多次,但始终修改的是同一个 i f1() f1() // 注意 f2 和 f1 是两个不同的函数实例, // 她与 f1 维护的上下文环境是隔离的, // 即 f2 中操作的 i 和 f1 中操作的 i 不是同一个 f2()
这是一个闭包,闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010