setTimeout,延時觸發(fā)。
用法示例
setTimeout(`console.log(1)`,1000);
setTimeout(()=>{console.log(1)},1000);
首先,理解 setTimeout 是一個函數方法,接收兩個參數,會異步加載傳入的函數。
function cslog(){
setTimeout(`console.log(5)`,3000)
};
console.log(1);
cslog();
setTimeout(`console.log(2)`,2000);
setTimeout(`console.log(3)`,1000);
console.log(4);
//返回的結果依次為1,4,3,2,5
//由于異步,所以先執(zhí)行1,4,再執(zhí)行3,2,5,
//注意,這里的 5 最后執(zhí)行
ok,這里談談最后打印 5 。
我的理解是,setTimeout 所謂異步,會將所有傳入的函數放在同一個作用域下,然后根據延時的時間依次執(zhí)行。
還有一點,setTimeout 會返回一個數字,作為異步執(zhí)行的一個標識,可以通過clearTimeout 這個值,讓其不執(zhí)行,并且這個值是全局的,可以在同頁面的任何地方操作,這點用的多的應該是 setInterval 及 clearInterval。
let timer;
function a(){
timer = setTimeout(()=>{console.log(1)},10000); //10s 后打印1
};
function b(){
a();
console.log(2)
};
clearTimeout(timer) ;
以上,我們知道可以取消10s后的打印,感覺是將 setTimeout 賦值給 timer,timer 是全局的,但是,但是,但是,這里的 timer 是 number,也就是說,只需要知道 number 的值,我們就可以直接 clearTimeout(number) 達到同樣的效果。
所以,可以這樣理解 setTimeout,每次進行 setTimeout 會生成一個狀態(tài)并給這個狀態(tài)一個編號,并且這個編號是連續(xù)的,當主路上的代碼執(zhí)行完后,才開始執(zhí)行所有的異步代碼,所有的異步代碼,通過設定的延時時間分先后同步執(zhí)行。
function cslog(){
setTimeout(`console.log(5)`,1000)
};
console.log(1);
cslog();
setTimeout(`console.log(2)`,1000);
setTimeout(`console.log(3)`,1000);
console.log(4);
//打印結果1,4,5,2,3
//延時都為1s,異步后,代碼又得按同步規(guī)則進行執(zhí)行
所以,這個會怎樣輸出呢?
function a(){
setTimeout(()=>{
setTimeout(()=>{
console.log(1)
},1000)
console.log(2)
},2000)
};
setTimeout(()=>{console.log(3)},3000);
a();
//**************************************************************************************************2 3 1