前端面试笔试题分享

第一题

console.log(a)//undefinedvara=1;vargetNum=function(){a=;}functiongetNum(){a=3;}console.log(a)//1getNum()console.log(a)//

这道题主要考查声明提升和函数声明先于变量声明这两个知识点。在解析这个js片段的时候是按照这样的顺序:

//声明提升functiongetNum(){a=3;}vara;vargetNum;//console.log(a);a=1;getNum=function(){a=;}console.log(a)getNum()console.log(a)

这样就很清晰了,第一次输出a的时候还没有赋值,所以是undefined。第二次的不用说了。第三次输出是因为,一开始getNum是指向一个函数的,后来又声明赋值成了一个函数表达式。

第二题//每隔一秒输出一次i值for(vari=0;i5;i++){//TODO}

此题主要考查闭包和js执行机制。以下几种解法:

大概1秒输出一次的版本:

//利用立即执行函数形成闭包(function(i){setTimeout(function(){console.log(i)},i*)})(i)

//利用setTimeout的第三个参数形成闭包setTimeout(function(i){console.log(i)},i*,i)

//如果不是题目中指定了var,利用ES6的let就简单多了for(leti=1;i5;i++){setTimeout(function(){console.log(i)},i*)}

//再看ES7版本constsleep=(time)=newPromise((solve,ject)=setTimeout(solve,time));(asyncfunction(){for(leti=0;i10;i++){awaitsleep();console.log(i);}})()

之所以是说是大概,是因为setTimeout并不是延时多少秒后执行函数,而是多少秒后把函数扔进事件队列中等待执行,如果此时队列里有其他任务的话那就不是精确的1秒了。

再看比较精确的1秒版本:

for(vari=0;i5;i++){vartime=newDate();while(newDate()-time){}console.log(i)}

直接阻塞线程一秒钟,简单粗暴有木有~

第三题

vara={}varb={key:"a"}varc={key:"c"}a[b]="13";a[c]="";console.log(a[b])//

这题主要考查对象。其实这里a[b]和a[c]中的b、c都会调用object.prototype.toString(),都变成了[objectObject],这样就与对象中的key值无关了。所以a[b]和a[c]的指向是相同的。

第四题

varf=function(){varc="ccc";turn{a:function(){turnc;},b:function(d){c=d;}}}()console.warn(f.a())//cccconsole.warn(f.c)//undefinedconsole.warn(f.b("


转载请注明:http://www.aierlanlan.com/rzgz/9466.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了