setTimeout

一.考察闭包

// 输出全为10

for(var i=0;i<10;i++){

   setTimeout(function(){

       console.log(i);

   },50);

}

 

答1:使用闭包

for(var i=0;i<10;i++){

    (function(i){

        setTimeout(function(){

        console.log(i);

        },50);

    })(i);

}

答2.使用ES6块级作用域

for (let i = 0; i < 5; i++) {

setTimeout(() => {

console.log(i);

}, 1000);

}

 

二、考察异步

问下面console.log的顺序

var arr = [1000,2000,1000];

for (let j = 0; j < arr.length; j++) {

setTimeout(() => {

console.log(j);

}, arr[j]);

}

答:

0,2,1

 

问:如何使上面console.log按顺序执行?

答:使用递归

​
var i = 0; 
function isfun() {  
     //your code here 把逻辑写在settimeout里,用递归的方式
    //-----
    console.log(i);
    let docs = [1000, 2000, 1000];
    (++i < 3) && setTimeout("isfun()", docs[i - 1]);    
    
    /*或者通俗点这样写
    i++;
    if(i<30){
        setTimeout("isfun()", 3000);
    }
    */
}

​

 

改进:减少全局变量

function isfun2(k = 0) {   
    //your code here 把逻辑写在settimeout里,用递归的方式
    //-----
    console.log(k);
    let docs = [1000, 2000, 1000];
    (++k < 3) && setTimeout(() => {
        isfun2(k)
    }, docs[i - 1]);

    /*或者通俗点这样写
    i++;
    if(i<30){
        setTimeout("isfun()", 3000);
    }
    */
}

三、编程题

题目:实现一个类,使每隔指定的秒数执行对应的console.log

new Queue()

.task(() => {

console.log(1)

}, 1000)

.task(() => {

console.log(2)

}, 2000)

.task(() => {

console.log(3)

}, 1000)

.run()

答:

class Queue {
    args = [];
    _self = this;
    task(fn,time) {
        this.args.push([fn,time]);
        return this._self;
    };
    run(k = 0) { 
        let that = this;
        that.args[k][0]();
        (++k < that.args.length) && setTimeout(() => {
            that.run(k)
        }, that.args[k][1]);

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章