js之闭包经典面试题
//1.下面代码执行后的结果是?如何处理
var arr = [];
for(var i = 0;i<10;i++){
arr.push(function () {
console.log(i);
})
}//[function(){},function(){},function(){},function(){}。。。。]
arr[6](); //i是几 10
// //由于for循环先执行,函数的调用后执行 因此函数调用的时候 for循环已经执行完了,i==10
//解决问题 闭包 闭包特点:闭包中声明的变量 类似于全局变量 会被一直保存在内存中
var arr1 = [];
for (var i = 0; i < 10; i++) {
(function(a) {
//形参a相当于声明了变量a
//var a = i
arr1.push(function() {
console.log(a); //6
})
})(i)
}
arr1[6](); //6
/*示例
for (var i = 0; i < liS.length; i++) {
(function (a) {
//函数的形参 就相当于在 函数中 声明了一个变量
//var a = 实参0
liS[a].onclick = function () {
console.log(a); //5
}
})(i);
}*/
//2.
function fun(n, o) {
console.log(o);
return {
fun: function(m) {
return fun(m, n);
}
};
}
var a = fun(0); //n:0 o:undefined undefined
//a:{fun:function(m){ return fun(m,n) }} //这里调用的fun是全局的fun函数
a.fun(1); //m:1 n:0 fun(1,0) 0
a.fun(2); //m:2 n:0 fun(2,0) 0
a.fun(3); //m:3 n:0 fun(3,0) 0
//上述所有a的fun方法的调用 获取的都是第0个n
//3.
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i, new Date());
}, 1000);
}
console.log(i, new Date()); //循环已经结束 i==5 当前时间
//5 当前时间
//(5 当前时间+1s)*5
//js中分为 同步和异步 代码
//异步代码:事件 定时器 ajax
//同步代码:非异步代码
//js中先执行同步代码 再将异步代码从任务队列中取出 执行
//js在内存中开辟出了一块空间 任务队列 在执行代码的时候如果遇到异步代码就先放到任务队列中等待
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17634756.html