JavaScript面试试题系列一

利用业务时间,开始收集积累一些工作中不是很注意,面试时候可能会接触到的知识点

第一题

for(var i=0;i<5;i++){
    console.log(i);
}

很明显这道题比较简单,输出的结果就是0,1,2,3,4

第二题

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}

因为使用了setTimeout,会延迟执行,所以执行到console.log 的时候,i = 5;所以开始输出一个5,然后每个一秒再输出一个5。一共5个5

第三题、针对第二题,如何改变才能输出0,1,2,3,4
解决定时器有延时执行事件的情形,可以在定时器外面加一个立即执行函数来解决

for(var i =0;i<5;i++){
    (function(i){
        setTimeout(function(){
            console.log(i);
        },1000*i);
    })(i);
}

通过在执行函数中增加形参i,使内部能引用对i的使用

第四题、如何去掉第三题中立即执行函数的参数i,会出现什么?

for(var i =0;i<5;i++){
    (function(){
        setTimeout(function(){
            console.log(i);
        },1000 * i)
    })()
}

如果这样的话,内部定时器就没办法保持对i的引用。其实输出结果跟第二题是一样的

第五题,把立即执行函数作为参数传递给setTimeout

for(var i =0;i<5;i++){
    setTimeout((function(i){
        console.log(i);
    })(i),1000*i);
}

setTimeout可以接受函数或者字符串作为参数,这里给setTimeout 传递了一个立即执行函数,所以会立即执行,结果为 0,1,2,3,4

第六题,考察Promise 和JavaScript运行机制

setTimeout(function(){
    console.log(1);
},0);

new Promise(function executor(resolve){
    console.log(2);
    for(var i = 0;i<10000;i++){
        i = 9999 && resolve();
    }
    console.log(3);
}).then(function(){
    console.log(4);
});
console.log(5);

通过JavaScript的运行机制
首先是一个定时器setTimeout,因此开始不会输出1
然后是一个Promise,里面的函数是立即执行的,因此首先输出2,3
然后,Promise的then函数应该在其他进程执行完了后继续执行
因此,继续输出5,然后输出4,最后执行定时器,输出1
最终结果应该是2,3,5,4,1。

猜你喜欢

转载自blog.csdn.net/u012832088/article/details/79776173