function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();
// 上面这个js程序输出的是什么()?
A、 0 1 0
B、 0 1 2
C、 0 0 0
D、 0 0 2
答案留到最后!
一般来说函数执行完后它的局部变量就会随着函数调用结束被销毁,但是此题Foo函数返回了一个匿名函数的引用(即一个闭包),它可以访问到Foo()被调用产生的环境,而局部变量i一直处在这个环境中,只要一个环境有可能被访问到,它就不会被销毁,所以说闭包有延续变量作用域的功能。所以 第一个f1(); 为0,第二个 f1(); 为 1
那f2();是什么呢?
我一开始认为f1和f2都=Foo()是都指向同一个function引用类型,所以顺利成章认为f2()为2,但其实Foo()返回的是一个匿名函数,所以f1,f2相当于指向了两个不同的函数对象,所以结果f2其实为0
答案:A