js经典试题之闭包
1:以下代码输出的结果是?
function Foo(){ var i=0; return function(){ document.write(i++); } } var f1=Foo(), f2=Foo(); f1(); f1(); f2();
答案:0 1 0
解析: 这是一个闭包,闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加1,但是相互之间不影响,因此结果是0
2:以下代码输出的结果是?
function test() { var n = 4399 function add() { n++ console.log(n) } return {n:n, add:add} } var result1 = test() var result2 = test() result1.add() result1.add() console.log(result1.n) result2.add()
答案:4400 4401 4399 4400
解析:
test构成了一个闭包,result跟result2各自有自己的test作用域,所以最后result2.add()结果是4400
前两个没啥好说的,懵逼点在第三个,这里{n:n}是对变量n里的值进行缓存,而不是本身n这个指针变量,这样生成add的时候n指向的值是多少{n:n}里的值就是多少(这里返回的对象是个深拷贝)