今天在刷題的時候遇到了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第一個參數能夠是當即執行或者一個執行函數。
//當即執行函數
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
複製代碼