これにより、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
なければ、これは問題になりません。eval
setTimeout()
に文字列を渡すと、奇妙なバグが発生し、奇妙なバグが痛みにつながり、痛みが苦しみsetTimeout
にeval
つながります。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);