有没有办法使用纯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构建their parser以允许针对给定范围评估表达式(JS的一小部分)的方式。

关于javascript - 使用其他对象作为全局值来评估字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18771543/

10-10 07:16