244

私はJavaScriptを学んでおり、最近JavaScriptのタイミングイベントについて学びました。W3SchoolssetTimeoutで知ったとき、今まで出会ったことのない奇妙な姿に気づきました。彼らは二重引用符を使用してから、関数を呼び出しています。

例:

setTimeout("alertMsg()", 3000);

JavaScriptの二重引用符と一重引用符は文字列を意味することを私は知っています。

また、私はそのように同じことができることを見ました:

setTimeout(alertMsg, 3000);

かっこを付けて参照し、かっこを付けないとコピーされます。引用符と括弧を使用していると、気が狂ってしまいます。

誰かが私にこれらの3つの使用方法の違いを説明してくれたら嬉しいですsetTimeout

括弧付き:

setTimeout("alertMsg()", 3000);

引用符と括弧なし:

setTimeout(alertMsg, 3000);

そして3番目は引用符のみを使用しています:

setTimeout("alertMsg", 3000);

setTimeout注意:参照用のより良いソースはMDNです。

4

6 に答える 6

384

setIntervalまたはを使用するsetTimeout

setTimeoutまたはの最初の引数として関数への参照を渡す必要がありますsetInterval。この参照は、次の形式である可能性があります。

  • 匿名関数

    setTimeout(function(){/* Look mah! No name! */},2000);
    
  • 既存の関数の名前

    function foo(){...}
    
    setTimeout(foo, 2000);
    
  • 既存の関数を指す変数

    var foo = function(){...};
    
    setTimeout(foo, 2000);
    

    「関数名」とは別に「関数内の変数」を設定していることに注意してください。変数と関数名が同じ名前空間を占め、お互いを壊す可能性があることは明らかではありません。

引数を渡す

関数を呼び出してパラメーターを渡すには、タイマーに割り当てられたコールバック内で関数を呼び出すことができます。

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);

引数をハンドラーに渡す別の方法がありますが、クロスブラウザー互換ではありません

setTimeout(foo, 2000, arg1, arg2, ...argN);

コールバックコンテキスト

デフォルトでは、this実行時のコールバックのコンテキスト(タイマーによって呼び出される関数内の値)はグローバルオブジェクトwindowです。変更したい場合は、を使用してbindください。

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);

安全

可能ですが、またはに文字列を渡さないでください。文字列を渡すと、文字列をスクリプトとして実行するのと同様の機能が作成または使用され、任意の潜在的に有害なスクリプトの実行が可能になります。setTimeoutsetIntervalsetTimeout()setInterval()eval()

于 2012-04-25T09:39:08.067 に答える
3

あなたが書いたsetTimeout関数が実行されていないと思います。jquery を使用している場合は、次のようにして正しく実行できます。

    function alertMsg() {
      //your func
    }

    $(document).ready(function() {
       setTimeout(alertMsg,3000); 
       // the function you called by setTimeout must not be a string.
    });
于 2012-04-25T09:44:28.017 に答える
2

ジョセフに完全に同意します。

これをテストするフィドルは次のとおりです。http://jsfiddle.net/nicocube/63s2s/

フィドルのコンテキストでは、関数がグローバルスコープで定義されていないため、文字列引数は機能しません。

于 2012-04-25T09:44:02.290 に答える