例1:以下代码的执行结果是?如何处理?
var arr = [];
for(var i = 0;i<10;i++){
arr.push(function () {
console.log(i);
})
}
arr[6]();
//-----控制台输出-------
10
/*
解释:for实现的就是往arr数组里添加函数,函数内部打印i,
函数内容打印的i是闭包内的变量,访问的i是类似于全局变量 ,
访问的时候for循环已经走完,最后i的值是10,所以,arr数组中
存放的都是函数log(10);
*/
例2:以下代码的执行结果
function fun(n,o){
console.log(o);
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
//-----控制台输出-------
undefined
0
0
0
/*
解释:第一次调用fun(n,0),给n传值为0,o没有传值,所以打印o是undefined,
并且把返回的结果赋值给a,a.fun(1),调用fun:把1传给m,然后调用外面的fun()
,并把m,n传过去,也就是把m=1,n=0(n=0是因为第一次赋值,后面调用了外面的n,
类似于全局变量,n一直是0)传给n,o,然后log(o),所以打印的是0
*/
例3:以下代码的执行结果
for(var i = 0;i<5;i++){
setTimeout(function () {
console.log(i, new Date());
},1000);
}
console.log(i, new Date());
//-----控制台输出-------
5 Fri Jul 17 2020 11:16:27 GMT+0800 (中国标准时间)
5 Fri Jul 17 2020 11:16:28 GMT+0800 (中国标准时间)
5 Fri Jul 17 2020 11:16:28 GMT+0800 (中国标准时间)
5 Fri Jul 17 2020 11:16:28 GMT+0800 (中国标准时间)
5 Fri Jul 17 2020 11:16:28 GMT+0800 (中国标准时间)
5 Fri Jul 17 2020 11:16:28 GMT+0800 (中国标准时间)
/*
涉及同步,异步问题,for循环是同步,比定时器先执行,所以打印的i都是5,
第一次先打印当前时间,过一秒后定时器执行5次,所以输出结果如上所示
*/
面试题-闭包面试题
于 2020-07-17 11:20:28 首次发布