2

Eval によって JavaScript に動的スコープがもたらされると人々は言いますが、そのステートメントがどのように有効であるかはわかりません。Eval を使用すると、呼び出し環境と同じレキシカル環境/変数環境を使用して式が評価されます ( ECMA 262 v. 5を参照)。式の代入または宣言は明らかに動的ですが、動的スコープを導入すると言うのは妥当ではないと思います。

Eval は動的スコープを導入しないと言っているのは正しいですか?

4

1 に答える 1

1

はいといいえ。

厳密には違います。言語は引き続き字句的に動作します (ただし、this常に動的にスコープされる を除きます)。

ただし、リンク先の質問全体を読むと、質問者が動的スコープをエミュレートするために使用evalしていることがわかります。

var x = 1;

function g() {
    print(x);
    x = 2;
}

function f() {
    // create a new local copy of `g` bound to the current scope
    // explicitly assign it to a variable since functions can be unnamed
    // place this code in the beginning of the function - manual hoisting
    var g = eval(String(g));
    var x = 3;
    g();
}

f();                         // prints 3

print(x);                    // prints 1

動的スコープをエミュレートすることは、その質問の質問者がそれを使用している方法で完全に達成可能です。アスカーはeval、外部で定義された関数を別の関数のスコープに実際にインポートするために使用しています。これには、関数を文字列化して再宣言する必要があります。したがって、まったく新しい関数が宣言されているため、外部で定義された関数は実際には別の関数のスコープ内で実行されているわけではありません (この例は、厳密な意味での動的スコープを実際には示していません)。そうは言っても、質問者の意図は動的スコープをエミュレートすることであり、彼は eval でそれを達成しています。

于 2013-02-26T12:49:19.710 に答える