Skip to main content

闭包面试题案例

什么是闭包

高级程序设计三中:闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)

闭包的作用

正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的 变量,在函数执行完之后依旧保持没有被垃圾回收处理掉

题目 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