2

純粋なJavaScriptを使用して、次のようなことを行う方法はありますか?

var x = 12;
var subGlobal = {};
evalInGlobal(subGlobal, "x = 100;");

console.log(x); //--> 12
console.log(subGlobal.x); //--> 100

理論的根拠は、分離された環境でスクリプトを実行したいということです。そのため、各スクリプトは参照できますが、xそれxは異なります(たとえば)。

4

3 に答える 3

1

私が得ることができる最も近いものはこれです。事前にglobal使用する変数のセットを初期化する必要があります。code

var evalInGlobal = function(global, code) {
    global.x = null; // this is necessary
    with(global) { 
        eval(code); 
    };
};
var x = 12;
var subGlobal = {};
evalInGlobal(subGlobal, "x = 100;");

console.log(x); //--> 12
console.log(subGlobal.x); //--> 100

初期化をなくすには、コード ブロックをスコープを意識したものに変換する必要があると思います。たとえば、 を呼び出して変換x = 100;function(ctx) { ctx.x = 100; }、呼び出しfn(global)ます。

これは、AngularJSがパーサーを構築して式 (JS の小さなサブセット) を特定のスコープに対して評価できるようにする方法に似ています。

于 2013-09-12T18:54:25.573 に答える
0

上記の @LightStyle のコメントに同意します。ただし、このようなことを行うこともできますが、これはおそらくあなたが望んでいることとはまったく異なります。

var x = 12;
var subGlobal = function() {};
subGlobal.x = undefined;

function m() {
    this.x = 100;
}

m.apply(subGlobal);

console.log(x); //--> 12
console.log(subGlobal.x); //--> 100
于 2013-09-12T18:25:46.570 に答える