0

次の違いを理解したいと思います:

var the_timeout = setTimeout("alert(the_string);", 60000);

と:

  var the_timeout = setTimeout("alert(" + the_string + ");",60000);

最初に変数を渡し、2 番目に値を渡すことは理解していますが、それは正確には何を意味し、なぜそれが重要なのですか? 2 番目の例で値が渡されるのはなぜですか?

また(これが同じ主題であることを願っています)、なぜこれが機能するのですか:

var timeout=setTimeout("someFunction();", 3000)

これはしませんが:

var timeout=setTimeout(someFunction(),3000);

関数を呼び出すと機能するsomeFunction()のに、使用するときに引用符を追加する必要があるのはなぜですかsetTimeout()?

4

2 に答える 2

5

これで、値渡しと参照渡しの違いを混同していると思います。あなたが言及した例では、違いはありません。

でも、

var timeout=setTimeout("someFunction();", 3000)

作品と:

var timeout=setTimeout(someFunction(),3000);

someFunction()2番目のケースでは、結果/戻り値をに渡すことができるように実行されるため、そうではありませんsetTimeout。そのため、それを文字列として渡し、単独でsetTimeout実行できるevalようにします。もちろん、それ自体がコールバックとして使用できるsomeFunction()関数を返す場合を除きます。setTimeout

ただし、コメントで zerkms が指摘したように、代わりにコールバックを渡す必要があります。

var timeout = setTimeout(function() { someFunction(); }, 3000);

これには、必要なsetTimeoutときにいつでもコールバックを呼び出すことができるという効果もあります。主な利点は、通常の関数を渡すことができるため、すべてを文字列にパックするのではなく、使用している可能性のあるエディターを利用できることです。

var myTrigger = function() {
  someFunction();
};

var timeout = setTimeout(myTrigger, 3000);
于 2013-03-14T23:40:11.230 に答える
1

これにより、60 秒後に文字列内のコードが実行されます。

var the_string = "Hello";
setTimeout("alert(the_string);", 60000);
the_string = "Goodbye";

この手段alert(the_string)は、あたかも通常のコードであるかのように実行されます。したがって、「さようなら」と警告します。これは、コードが最終的に実行されるときにthe_string、変数を渡しているため、更新された値が使用されるためです。

しかし、これは微妙に異なることをします。

var the_string = "Hello";
setTimeout("alert(" + the_string + ");",60000);
the_string = "Goodbye";

現在、新しいコード スニペットをオンザフライで作成しています。作成中のスニペットはalert(Hello);. しかしHello、引用符を正しく取得しなかったため、値のない変数です。

しかし、あなたがこれを意味したとしましょう:

var the_string = "Hello";
setTimeout("alert('" + the_string + "');",60000);
the_string = "Goodbye";

生成されるコードはalert('Hello');. 一見、同じことをしているように見えます。しかし、生成されたコードには文字どおりハードコードされた文字列が含まれるようになったためthe_string、変更してもスニペットにハードコードされているため、変更は生成されたコードになりません。

それに基づいて、これは簡単です:

setTimeout("someFunction();", 3000)

文字列内のコードは遅延後に実行されます。この場合、someFunction()実行されます。

しかし、これはまったく異なります。

setTimeout(someFunction(),3000);

この場合、someFunction()すぐに実行され、その戻り値が関数の最初の引数として渡されsetTimeout()ます。したがって、期待どおりの結果は得られません。


. _ eval_ setTimeout(string,delay)_ また、 を使用せず、 に文字列を渡さevalなければ、これは問題になりません。evalsetTimeout()

に文字列を渡すと、奇妙なバグが発生し、奇妙なバグが痛みにつながり、痛みが苦しみsetTimeoutevalつながりますeval

代わりに、代わりに関数を渡します。あらゆる点で優れています。

// pass an anonymous function to run some code later
var the_string = "Hello";
setTimeout(function() {
  alert(the_string);
}, 60000);
the_string = "Goodbye";
// alerts "Goodbye" 60 seconds later


// pass an anonymous function to run some code
setTimeout(function() {
  someFunction();
}, 3000);

// or pass a reference to a function to execute, note lack of ()
setTimeout(someFunction, 3000);
于 2013-03-14T23:55:20.810 に答える