純粋なJavaScriptを使用して、次のようなことを行う方法はありますか?
var x = 12;
var subGlobal = {};
evalInGlobal(subGlobal, "x = 100;");
console.log(x); //--> 12
console.log(subGlobal.x); //--> 100
理論的根拠は、分離された環境でスクリプトを実行したいということです。そのため、各スクリプトは参照できますが、xそれxは異なります(たとえば)。
純粋なJavaScriptを使用して、次のようなことを行う方法はありますか?
var x = 12;
var subGlobal = {};
evalInGlobal(subGlobal, "x = 100;");
console.log(x); //--> 12
console.log(subGlobal.x); //--> 100
理論的根拠は、分離された環境でスクリプトを実行したいということです。そのため、各スクリプトは参照できますが、xそれxは異なります(たとえば)。
私が得ることができる最も近いものはこれです。事前に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 の小さなサブセット) を特定のスコープに対して評価できるようにする方法に似ています。
上記の @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