2017-04-10 6 views
0

このコードが何も成し遂げていないという事実を無視してください。setTimeout()に関数呼び出し(関数参照や匿名関数ではなく)を渡せないのはなぜですか?

最初の引数としてsetTimeout()に関数呼び出しを渡すことはできませんが、なぜできないのですか?

let names = ['Andy', 'Ross', 'David']; 

function printer (name) { 
console.log(name); 
} 

names.forEach(name => setTimeout(printer(name), 1000); 

結果:

Andy 
timers.js:327 
    throw new TypeError('"callback" argument must be a function'); 
    ^

私の代わりにprinterへの参照を使用して、それに沿ってnameを送信するためにbind()を使用して問題を解決することができますが、なぜ私は、これらの追加手順を実行する必要がありますか?

let names = ['Andy', 'Ross', 'David']; 

function printer (name) { 
    console.log(name); 
} 

names.forEach(name => setTimeout(printer.bind(null, name), 1000)); 

結果:最初の引数としての機能を取る必要があります

setTimeout(function(){printer(name)}, 1000) 
+0

setTimeoutは後で呼び出されるコールバックを受け取る必要があるため、 –

答えて

0

setTimeout

Andy 
Ross 
David 
0

あなたはこのようにそれを行うことができます:関数参照を渡す正しい方法はコールバックを使用することです

setTimeout(printer, 1000, name) 
0

names.forEach(name => setTimeout(function() { 
    printer(name); 
}, 1000)); 

コールバックには、関数への参照が含まれています。

setTimeout(callbackFunction, milliseconds); 
2

これは実行順序によるものです。 setTimeoutに関数呼び出しを渡すと、その関数は即座に実行されます。つまり、関数はJavaScriptの実行スタックにすぐに配置されます。

関数名、つまり関数への参照を渡すと、関数はタイマーの終了後にのみJavaScriptスクリプトの実行スタックに置かれます。

+0

ありがとう、それは完璧な意味合いです!それは有り難いです。 – NoobOfNoobs

関連する問題