7

私はそれを知ってevalおり、setTimeout両方とも(1番目の)パラメーターとして文字列を受け入れることができます。これは使用しない方がよいことを知っています。なぜ違いがあるのか​​興味があります。

!function() {
    var foo = 123;
    eval("alert(foo)");
}();

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

1つ目は機能し、2つ目はエラーになります。foo is not defined

彼らは舞台裏でどのように処刑されていますか?

4

5 に答える 5

6

MDNのリファレンスをsetTimeout参照してください。

文字列リテラルはグローバルコンテキストで評価されるため、文字列がコードとして評価される場合、setTimeout()が呼び出されたコンテキストのローカルシンボルは使用できません。

対照的に、eval()に渡される文字列リテラルは、evalの呼び出しのコンテキストで実行されます。

于 2012-07-27T08:59:13.323 に答える
2

setTimeoutevalはグローバルスコープで追加で実行されるため、を認識しませんfoo

これをバックアップするためのリファレンスは次のとおりです。

文字列リテラルはグローバルコンテキストで評価されるため、文字列がコードとして評価される場合、setTimeout()が呼び出されたコンテキストのローカルシンボルは使用できません。

于 2012-07-27T08:58:18.303 に答える
1

setTimeoutは、関数参照およびタイムアウトよりも多くのパラメーターを取ります。タイムアウトを過ぎて入力されたものはすべて、パラメーターとして関数に渡されます。

setTimeout(myFunction(param1, param2), 0, param1, param2);
于 2013-05-17T13:24:52.673 に答える
0
!function() {
    var foo = 123;
    eval("alert(foo)");
}();

このコードを実行すると、javascriptは3行目が「alert(foo)」と言っているふりをします。Fooは関数のスコープで定義されます。

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

このコードを実行すると、javascriptは新しい関数に入ります。つまりfunction() {alert(foo)}。その'new'関数のスコープでは、fooは定義されていません。

于 2012-07-27T08:59:25.573 に答える
0

正解を補足するものとして、これを呼び出すとeval同じ動作が得られ、この場合はエラーが発生します。

!function() {
    var foo = 123;
    window.eval("alert(foo)"); // <- note the window.eval, this is important and changes the behavior of the `eval` function
}();

!function() {
    var foo = 123;
    setTimeout("alert(foo)", 0);
}();

このブログ投稿では、さまざまなタイプについて詳しく説明しています。http eval: //perfectionkills.com/global-eval-what-are-the-options/

于 2017-09-21T22:38:05.243 に答える