javascript - 使用不同的对象作为全局对象评估字符串

标签 javascript eval global

有什么方法可以使用纯 javascript 来执行以下操作吗?

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

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

基本原理是我想在隔离环境中运行脚本,因此每个脚本都可以引用 xx 是不同的(例如).

最佳答案

我能得到的最接近的是这个。它需要预先初始化code中使用的global变量集。

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/

相关文章:

javascript - 在事件监听器中使用 eval(myFunctionName) 作为回调的替代方法是什么?

jquery - 在函数外部声明全局变量时遇到问题

python - 如何在 Python 中制作 "local object"?

javascript - 在 Ionic 2 中链接到带有附加跟踪代码的外部 URL

javascript - iMacros 使用 EVAL 删除文本

python - 如果名称存储在变量中,则访问 Python 中的模块级函数

javascript - 如何更改函数中全局变量的值?

javascript - 哈皮 v16.x.x : compose multiple route plugins into one

javascript - 选择 Mongoose 模式中的所有字段

Javascript 同步 AJAX 超时