6

呼び出し時にグローバルに使用するオブジェクトを指定する方法はありますeval()か?

(グローバル eval() の実行方法を尋ねているわけではありません。)

これは機能していませんが、これは私が望むものを示しています:

var pseudoGlobal = {};
eval("x = 12", pseudoGlobal);
pseudoGlobal.x; // 12

要点は、実際のグローバル バインディングは、eval() されたコード内の暗黙の変数宣言 (つまり、 varキーワードなし) の影響を受けないということです。

eval.call(pseudoGlobal, "x=12")またはに関してeval.apply(pseudoGlobal, ["x=12"])は、一部のインタープリターはそれを許可しません。

4

2 に答える 2

3

もちろん、次のように、プロパティ値を割り当てる代わりにデフォルト オブジェクトを使用できます。

with (pseudoGlobal) eval("x=12")

ただし、プロパティを作成するためではありません。実行コンテキストの現在のスタックでプロパティが見つからない場合は、グローバル オブジェクトで作成されます。それだけです。また、いくつかの奇妙なことを試すかもしれません:

//global code
var globalvars = {};
for (i in this)
    globalvars[i] = null;
with (pseudoGlobal) 
    eval("x=12")
for (i in this)
    if (!(i in globalvars))
{
    pseudoGlobal[i] = this[i];
    delete this[i];
}

グローバルバインディングが気になる場合は、次を試してください。

var globalvars = {};
for (i in this)
    globalvars[i] = this[i];
with (globalvars) 
    eval("x=12")

このようにして、グローバル変数でバインディングが変更されます。浅いコピーでは、1 レベルのビンジングのみが変更されるのを防ぐことに注意してください。

于 2012-06-15T13:01:10.320 に答える
1

これを行う組み込みの方法はありません。

頭に浮かぶ2つの解決策があります。

  • evaled コード内のすべての割り当てにプレフィックスを付けます。つまり、 の代わりにx = 12、 のようなことをしなければなりませんo.x = 12
  • スクリプトをサンドボックス化し、割り当てられたすべての変数を含むオブジェクトを返す独自の Javascript インタープリターを作成します。
于 2012-06-15T12:43:20.847 に答える