2012-01-31 6 views
1

私はJavaスクリプトの初心者で、現在はJohn ResigのProのJavaScriptテクニックを読んでいます。クロージャを説明しながら、彼はsetTimeout("otherFunction()",2000)のようなコールを、新しいJS開発者が問題を抱えるインスタンスとして参照します。なぜこれが問題なのか理解できませんでしたか?このhttp://www.w3schools.com/js/js_timing.aspでは、私に似ているvar t=setTimeout("alertMsg()",3000);のような電話があります。setTimeout( "otherFunction()"、2000)が間違っているのはなぜですか?

+7

w3schoolsが学ぶ良いサイトではない理由のいくつかの例の1つが見つかりました。詳細については、http://w3fools.com/ –

答えて

6

それはではありません。「間違っている」とは必ずしも「正しく」あるとは限らず、確かに推奨されません。

setTimeout() functionの最初のパラメータには、文字列または関数参照/関数式を指定できます。

文字列を渡すと、効果的にeval()not recommendedになるため、文字列を渡すと処理が遅くなります。スピードよりも重要なのは、文字列内のコードが実行されるスコープが、期待しているものと異なる可能性があります(異なるブラウザでは同じでない可能性があります)。

代わりに関数参照/関数式を渡すことで、これらの問題を回避できます。

ご例えば「右」構文は次のとおりです。そこには括弧はotherFunction後でない

setTimeout(otherFunction, 2000); 

注 - があった場合、それはすぐにotherFunction()を呼び出し、setTimeout()にその関数からの戻り値を渡します。

あなたはあなたの関数にパラメータを渡す必要がある場合は、匿名関数でラップすることができます

setTimeout(function() { 
    otherFunction(param1, param2); 
}, 2000); 

setTimeout("otherFunction(param1,param2)", 2000)に比べて種類の不格好に見えるかもしれませんが、再び、それはparam1、どこotherFunctionの範囲の問題を回避およびparam2が定義される。

+0

+1。 – CMS

+0

優れた答え。 – molf

5

推奨されるアプローチは、以下を使用することです:

setTimeout(otherFunction, 2000); 

または閉鎖:JavaScriptのインタプリタがする必要があるため

setTimeout(function() { 
    otherFunction(); 
}, 2000); 

は、最初のパラメータとして文字列を受け取るオーバーロードを使用しないでください。この文字列をjavascriptコードに解析します。

http://www.w3schools.comにリンクしているサイトはおそらくプログラミングを学ぶ最悪のサイトの1つです。あなたがしてはいけないことを正確に示しています。

+3

-1「setTimeoutで文字列を使用しない理由は何ですか?」を参照してください。 - "推奨されるアプローチは文字列を使用しないためです。" – molf

+0

@molf、はい、そうです。あなたは本当にインタプリタがあなたの文字列をjavascriptコードに何度も解析することを強制したくありません。 –

+2

@molfが作っていたことは、あなたが説明していないことです。 – nnnnnn

1

これは毎回evalotherFunction()である(したがって、インタプリタの新しいインスタンスを生成する)ためです。関数への参照を提供すると、setTimeoutは新しいインタプリタを生成する必要なく実行することができます。

だから使用:「」で囲まれた

setTimeout(otherFunction,2000); 
+0

「新しいインスタンスを生成する」というのは、まさにその理由であり、「推奨されない」ほどではありません。スコープに言及すると+1 – georg

1

何が文字列であるので、JavaScriptインタープリタは、一般的に文字列を解析する必要があります。

動作しても文字列を解析する必要はありません。

我々は単にインタプリタが良くコードで、その結果、任意の追加の(不要な)仕事をするために必要とされていない

setTimeout(alertMsg,3000);

使用している場合。

0

setTimeout("otherFunction()",2000)の代わりに、 setTimeout(otherFunction,2000)の方がはるかに優れています。前の方法ではの文字列"otherFunction()"を実行する必要があります。

関連する問題