setTimeOut被忽略的第三个参数

2,024 阅读2分钟

今天在刷题的时候遇到了setTimeOut,发现了被忽略的第三个参数。

修改以下 print 函数,使之输出 0 到 99,或者 99 到 0

要求:

1、只能修改 setTimeout 到 Math.floor(Math.random() * 1000 的代码

2、不能修改 Math.floor(Math.random() * 1000

3、不能使用全局变量

function print(n) {
    setTimeout(() => {
        console.log(n);
    }, Math.floor(Math.random() * 1000));
}
for (var i = 0; i < 100; i++) {
    print(i);
}

参看各位大神的解法,主要有两种解法:


【解法一】

利用settimeout 接受多个参数的方法,将Math.floor(Math.random() * 1000)作为第三个参数,第二参数可设为任意值。

function print(n) {
    setTimeout(() => {
        console.log(n);
    }, 1, Math.floor(Math.random() * 1000));
}
for (var i = 0; i < 100; i++) {
    print(i);
}

题目中运用到了第三个参数:第三个参数是给setTimeout第一个函数的参数。 settimeout可以传递多个参数,第三个之后的参数都可以作为第一个函数的参数。

setTimeout的第三个参数你可能不知道的作用


【解法二】

settimeout第一个参数可以是立即执行或者一个执行函数。

//立即执行函数
function print(n) {
    setTimeout((() => {
        console.log(n);
    })(), Math.floor(Math.random() * 1000));
}
function print(n) {
    setTimeout(console.log(n), Math.floor(Math.random() * 1000));
}

向settimeout传递函数时要注意this的指向:

题目解析:向setTimeout() 传递一个函数时,该函数中的this指向跟你的期望可能不同,当前这些代码中包含的 this 关键字在非严格模式会指向window对象,严格模式下为undefined。此时可以借助call或apply去改变this指向,即可顺序打印出0到99(或倒序99到0)

function print(n) {
    setTimeout((() => {
        // console.log(this.i); // 如果不借助call会打印出100次全局变量i,值都为100
        console.log(n); // 顺序打印出0~99(100个)
        console.log(99 - n); // 倒序打印出99~0(100个)
    }).call(null, n), Math.floor(Math.random() * 1000));
}
for (var i = 0; i < 100; i++) {
    // console.log(i) // 0~99
    print(i);
}
console.log(i) // 注意:此时i在全局window里可访问到,值为100