私は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)が間違っているのはなぜですか?
答えて
それはではありません。「間違っている」とは必ずしも「正しく」あるとは限らず、確かに推奨されません。
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
が定義される。
推奨されるアプローチは、以下を使用することです:
setTimeout(otherFunction, 2000);
または閉鎖:JavaScriptのインタプリタがする必要があるため
setTimeout(function() {
otherFunction();
}, 2000);
は、最初のパラメータとして文字列を受け取るオーバーロードを使用しないでください。この文字列をjavascriptコードに解析します。
http://www.w3schools.comにリンクしているサイトはおそらくプログラミングを学ぶ最悪のサイトの1つです。あなたがしてはいけないことを正確に示しています。
これは毎回eval
otherFunction()
である(したがって、インタプリタの新しいインスタンスを生成する)ためです。関数への参照を提供すると、setTimeout
は新しいインタプリタを生成する必要なく実行することができます。
だから使用:「」で囲まれた
setTimeout(otherFunction,2000);
「新しいインスタンスを生成する」というのは、まさにその理由であり、「推奨されない」ほどではありません。スコープに言及すると+1 – georg
何が文字列であるので、JavaScriptインタープリタは、一般的に文字列を解析する必要があります。
動作しても文字列を解析する必要はありません。
我々は単にインタプリタが良くコードで、その結果、任意の追加の(不要な)仕事をするために必要とされていない
setTimeout(alertMsg,3000);
、
使用している場合。
setTimeout("otherFunction()",2000)
の代わりに、 setTimeout(otherFunction,2000)
の方がはるかに優れています。前の方法ではの文字列"otherFunction()"
を実行する必要があります。
- 1. 照明が間違っているのはなぜですか?
- 2. なぜPerlでは '0'が間違っていますか?
- 3. グラフapiページングが間違っています...なぜですか?
- 4. タイムスタンプの日付が間違っているのはなぜですか?
- 5. この再帰文が間違っているのはなぜですか?
- 6. 私の再帰関数が間違っているのはなぜですか?
- 7. なぜこのPythonコードが間違っていますか?
- 8. OpenLayers:なぜ私のベクターフィーチャーマーカーが間違っていますか?
- 9. なぜこのシャッフルアルゴリズムが間違っていますか?
- 10. RVMが間違ったrubygemを指しているのはなぜですか?
- 11. なぜGPS時間が間違っていて、1時間で違うのですか?
- 12. なぜこのSQLは間違っていますか(MySQL)?
- 13. なぜrequestCodeが間違っていますか?
- 14. なぜ$(window).height()が間違っていますか?
- 15. なぜereg( "^ \ d {11} $"、18311111111)が間違っていますか?
- 16. 返されるラジオボタンの値が間違っています。なぜですか?
- 17. 私のPerlテストが間違って失敗するのはなぜですか?
- 18. エンティティモデルの設計が間違っているか、間違っていますか?
- 19. タイムスタンプunix時刻と時刻()の違いが間違っているのはなぜですか?
- 20. 「[]内のインデックスの数が間違っています:なぜですか?
- 21. 正規表現のディジットのサブグループ間の ' - 'またはスペースが間違っているのはなぜですか?
- 22. なぜRowObjectEventArgsが間違った行を返すのですか?
- 23. ダブルプラスと時々正しい、なぜ間違っているのですか?
- 24. なぜ「ルビジェムを必要とするのは間違っていますか?」
- 25. java.util.Dateが私に間違った時間を与えているのはなぜですか?
- 26. 私はTextToSpeechで何が間違っているのですか
- 27. Schemeでこの再帰的な追加が間違っているのはなぜですか?
- 28. なぜ大数の素数のチェック結果が間違っていますか?
- 29. svn checkoutが間違ったURLを使用するのはなぜですか?
- 30. 「あなたのパスワードは間違っている」と言わないのはなぜですか?
w3schoolsが学ぶ良いサイトではない理由のいくつかの例の1つが見つかりました。詳細については、http://w3fools.com/ –