第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么這兩種setTimeout執(zhí)行順序不一樣

為什么這兩種setTimeout執(zhí)行順序不一樣

慕尼黑5688855 2019-03-17 16:14:21
const obj = {    name: " jsCoder",    skill: ["es6", "react", "angular"],    say: function ()    {        var that = this;        for (var i = 0, len = this.skill.length; i < len; i++)        {            setTimeout((function()            {                console.log(i);                console.log(that.skill[i]);            })(), 0)            console.log(i);        }    }};obj.say();這段代碼在Node里執(zhí)行會(huì)報(bào)錯(cuò),但可以在瀏覽器中執(zhí)行,執(zhí)行結(jié)果:第二種寫(xiě)法:const obj = {    name: " jsCoder",    skill: ["es6", "react", "angular"],    say: function () {        var that = this;        for (var i = 0, len = this.skill.length; i < len; i++) {            (function () {                var j = i;                setTimeout((function () {                    console.log(j);                    console.log(that.skill[j]);                }), 0)            })()            console.log(i);        }    }};obj.say();為什么,立即執(zhí)行函數(shù)是異步任務(wù)嗎?
查看完整描述

2 回答

?
不負(fù)相思意

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊

你的setTimeout的寫(xiě)法是錯(cuò)的(如果我沒(méi)猜錯(cuò)你的原意的話),setTimeout的第一個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),第二個(gè)參數(shù)是延遲執(zhí)行的毫秒數(shù)。你的第一個(gè)參數(shù)雖然好像是一個(gè)函數(shù),但你把這個(gè)函數(shù)用括號(hào)括起來(lái),又在后面加了個(gè)括號(hào)立即去調(diào)用它,這樣setTimeout的第一個(gè)參數(shù)遍被你設(shè)置成了這個(gè)函數(shù)的返回值而不是讓setTimeout來(lái)幫你執(zhí)行這個(gè)函數(shù),從你寫(xiě)的這個(gè)函數(shù)來(lái)看,這個(gè)返回值應(yīng)該是undefined,而undefined不是一個(gè)函數(shù),它不是可調(diào)用的,我猜node里報(bào)的錯(cuò)應(yīng)該是類(lèi)似

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function

at setTimeout (timers.js:425:11)

這樣的錯(cuò)誤吧?
正確的寫(xiě)法應(yīng)該是:

setTimeout(function() {

  // Do something here

}, someTime);

換種說(shuō)法就是,你需要傳給setTimeout的第一個(gè)參數(shù)是一個(gè)函數(shù)指針/引用,而不是當(dāng)場(chǎng)調(diào)用這個(gè)函數(shù)——這樣你將把函數(shù)的返回值而不是這個(gè)函數(shù)本身作為第一個(gè)參數(shù)傳入。

另外,setTimeout確實(shí)是異步的,并且現(xiàn)在推薦用setImmediate代替setTimeout(func, 0)。


查看完整回答
反對(duì) 回復(fù) 2019-03-23
  • 2 回答
  • 0 關(guān)注
  • 1034 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)