setTimeOut被忽略的第三個參數

今天在刷題的時候遇到了setTimeOut,發現了被忽略的第三個參數。html

修改如下 print 函數,使之輸出 0 到 99,或者 99 到 0git

要求:github

一、只能修改 setTimeout 到 Math.floor(Math.random() * 1000 的代碼bash

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

三、不能使用全局變量dom

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

參看各位大神的解法,主要有兩種解法:函數


【解法一】ui

利用settimeout 接受多個參數的方法,將Math.floor(Math.random() * 1000)做爲第三個參數,第二參數可設爲任意值。this

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

題目中運用到了第三個參數:第三個參數是給setTimeout第一個函數的參數。 settimeout能夠傳遞多個參數,第三個以後的參數均可以做爲第一個函數的參數。spa

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
複製代碼
相關文章
相關標籤/搜索