javascript常见面试题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
1 function fun(n,o){ 2 console.log(o);//每次都输出第二个参数 3 return {//返回一个对象 4 fun:function(m){//对象中包含函数 5 return fun(m,n);//函数内保护了外层函数第一个参数 6 } 7 } 8 } 9 var a=fun(0); 10 a.fun(1); 11 a.fun(2); 12 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
1 var funs=(function(){ 2 for(var i=0,arr=[];i<3;i++){ 3 arr[i]=function(){console.log(i)}; 4 }//i=3 5 return arr; 6 })(); 7 ////funs:[(i=3) 8 //// function(){console.log(i)}, 9 //// function(){console.log(i)}, 10 //// function(){console.log(i)} 11 //// ] 12 funs[0]();//3 13 funs[1]();//3 14 funs[2]();//3
这个题目主要是考察循环创建函数时 ,并没有调用函数,所以将
function(){console.log(i)};原样放到数组funs中,当调用funs中的函数时,才执行console.log ,此时 i 已经是循环结束的结果3了
所以三个结果都是输出3
以上是关于javascript常见面试题的主要内容,如果未能解决你的问题,请参考以下文章