利用业务时间,开始收集积累一些工作中不是很注意,面试时候可能会接触到的知识点
第一题
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。