闭包面试题案例
什么是闭包
高级程序设计三中:闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)
闭包的作用
正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的 变量,在函数执行完之后依旧保持没有被垃圾回收处理掉
题目 1
function fn2(){
var arr = [];
for (var i = 0; i < 5;i++) {
arr[i] = function (){
return i;
}
}
return arr;
}
var list = fn2();
for (var i = 0 , len = list.length;i<len;i++) {
console.log(list[i]());
}
问:输出的结果是什么?
答案
5 5 5 5 5
理由
上面的代码看起来很复杂,其实就是定义了一个空数组,里面存了五个函数,然后在下面的 for 循环中,遍历执行这个函数,而上面的其实就是一个闭包,因为只 return 了最后一位,也就是 5,所以会打印五个五
题目 2
问:如何把上面的闭包函数改成正常,使得打印出0 1 2 3 4
?
答案
function fn2(){
var arr = [];
for (var i = 0; i < 5;i++) {
arr[i] = (function(i) {
return function(){
return i;
}
})(i);
}
return arr;
}
var list = fn2();
for (var i = 0 , len = list.length;i<len;i++) {
console.log(list[i]());
}
题目 3
function fun(N,O){
console.log("N="+N);
console.log("O="+O);
return{
fun:function(M){
return fun(M,N);
}
}
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
console.log("---------------------")
var b = fun(0).fun(1).fun(2).fun(3);
console.log("---------------------")
var c = fun(0).fun(1);
console.log("---------------------")
c.fun(2);
console.log("---------------------")
c.fun(3);
问:打印出来什么
答案
function fun(N,O){
console.log("N="+N);
console.log("O="+O);
return{
fun:function(M){
return fun(M,N);
}
}
}
var a = fun(0); //N = 0 , O=undefined
a.fun(1); //N = 1 , O = 0
a.fun(2); //N = 2 , O = 0
a.fun(3); //N = 3 , O = 0
console.log("---------------------")
var b = fun(0).fun(1).fun(2).fun(3);//N = 0 , O=undefined ,N = 1 , O = 0,N = 2 , O = 1,N = 3 , O = 2
console.log("---------------------")
var c = fun(0).fun(1); //N = 0 , O=undefined,N = 1 O = 0
console.log("---------------------")
c.fun(2); //N = 2 O = 1
console.log("---------------------")
c.fun(3); //N = 3 O = 1
第一个var a = fun(0)
,这个就是把 0 传进去,返回保存了 a 对象,也就是刚刚传进去的 0,也就是无论后面调用多少次,a.fun()的本质都是一开始传进去的 0,所以打印出来的 O 除了第一次是没有定义为 undefined 之外,其余的都是 0