javascript常见面试题

时间:2023-03-09 18:38:53
javascript常见面试题
闭包相关面试题:
1.
var a=0,b=0;
function A(a){
A=function(b){console.log(a+b++);};
console.log(a);
}
A(1);
A(12);

A(1)正常执行,console.log(a);//1   当A函数被调用后  会创建一个全局的A函数,覆盖了原有的A函数,但是a作为受保护变量被保护起来形成闭包

此时 函数A变为

//A:function(b){(a=1)
// console.log(a+b++);
// };
(a=1)作为受保护变量
当再次调用A(12)时 返回 console.log(a+b++);//1+12 结果为13; 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);
var b=fun(0).fun(1).fun(2).fun(3);
var c=fun(0).fun(1); c.fun(2);c.fun(3);

fun()函数这个问题的主线:每次都输出第二个参数,并创建闭包封装第一个参数,闭包中的变量会自动成为下次调用的第二个参数

下面细看下这个问题:var a=fun(0);

    //console.log(o);//undefined

    //a:{fun:function(m){(n=0) return fun(m,n)}}  此时n=0作为受保护变量 封装到闭包中

  a.fun(1);//fun(1,0);  console.log(0);//0

   a.fun(2);//fun(2,0);  console.log(0);//0

   a.fun(3);//fun(3,0);  console.log(0);//0

对于

var b=fun(0).fun(1).fun(2).fun(3);
具体分析如下:
//var b=fun(0) //undefined
// //{fun(m){(n=0) return fun(m,n); }}
// .fun(1) //0
// //{fun(m){(n=1) return fun(m,n); }}
// .fun(2) //1
// //{fun(m){(n=2) return fun(m,n); }}
// .fun(3);//2
////b: {fun(m){(n=3) return fun(m,n); }}

对于

var c=fun(0).fun(1); c.fun(2);c.fun(3);
具体分析如下:
//var c=fun(0) //undefined
// .fun(1);//0
////c: {fun(m){(n=1) return fun(m,n)}}
// c.fun(2);//1
// c.fun(3);//1
 var funs=(function(){
for(var i=0,arr=[];i<3;i++){
arr[i]=function(){console.log(i)};
}//i=3
return arr;
})();
////funs:[(i=3)
//// function(){console.log(i)},
//// function(){console.log(i)},
//// function(){console.log(i)}
//// ]
funs[0]();//
funs[1]();//
funs[2]();//

这个题目主要是考察循环创建函数时 ,并没有调用函数,所以将

function(){console.log(i)};原样放到数组funs中,当调用funs中的函数时,才执行console.log ,此时  i 已经是循环结束的结果3了 
所以三个结果都是输出3