2012-01-23 11 views
1

私は2つのバージョンのコードを持っています。誰かが私に最適で速いことを教えてもらえますか?setTimeoutでJavascript関数を呼び出す - これは良いですか?

バージョン1:

function showMsg(a) 
{ 
    alert(a); 
} 
function invokeShowMsg() 
{ 
    var msg = 'hi'; 
    showMsg(msg); 
} 
window.setTimeout(invokeShowMsg,1000); 

バージョン2:

function showMsg(a) 
{ 
    alert(a); 
} 
window.setTimeout(function(){showMsg('hi');},1000); 

もう一つの疑問は、 "閉鎖" と呼ばれる発呼のバージョン2の方法ですか?

+0

"最適"の条件は何ですか?関数式を評価してその参照を渡すのではなく、すでに宣言されている関数への参照を渡すので、#1は高速ですが、さまざまなブラウザでテストする必要があります。いずれにしても、実行が最低1秒遅れている場合は、速度とはどのような関連性がありますか? – RobG

+0

モバイルブラウザで実行しているので、バージョン2で悪影響がありますか? – thandasoru

+0

あなたが試しても気付かないでしょう。ほとんどの* JSエンジンはコードをコンパイルします。 – Blender

答えて

4

スピードが行く限り、あなたは2つの間にどんな違いがあるか分からないので、好きなものを選んでください。

それはきれいで、読みやすい構文を保つように私は、#2を好む:

setTimeout(function() { 
    showMsg('hi'); 
}, 1000); 
+0

[それは本当にクロージャですか](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)? – voithos

+0

私は本当に匿名関数とクロージャを区別するための実用的な使用法を見つけていないので(私が両方を使用していても)、私には何の違いもないので、はいと言うだけです。 – Blender

+2

しかし、答えを実際に知っているため+1。私は恥ずべきで私の陳述を撤回する。 – Blender

3

はい、バージョン2が閉鎖と呼ばれています。速度に関しては、どちらも同等です。

+0

ありがとう、バージョン2(クロージャー)がバージョン1よりも遅いというGoogleのページのどこかを読んだ。私はコード全体にバージョン2を使用していました。実際には変更したくありません。 – thandasoru

2

@Blender氏によると、(半無駄な)「発信者」機能でグローバルスペースを汚染しないので、も好きです。それはきれいで、どのようにしてsetTimeoutが動作するかを知っている人には分かりやすいです。そして、スピードが進む限り、実質的に違いはありません。 Here's a performance comparison of the two methods

ただし、私が理解する限り、ではなく、クロージャーです。これは単なる匿名関数です。 JavaScriptでは、他の多くの動的言語と同様に、関数はファーストクラスの市民です。つまり、それらは作成して渡すことができます。つまり、オブジェクトです。しかし、クロージャーは単なる匿名関数ではありません。 this questionへの回答は、非常に簡潔にクロージャが何であるかを説明しています。

+0

リンクありがとうございます。そこに提供された優れた説明:-) – thandasoru