如何在新的Function上下文中访问全局变量

How to access global variables within a new Function context?

本文关键字:上下文 访问 全局变量 Function      更新时间:2023-09-26

例如,如果我有这个:

var foo = 444;
var x = new Function("console.log('5'); console.log(foo);");
x();

它说foo是未定义的。我希望能够访问这个new Function上下文中的foo和许多其他全局变量。

一种解决方案是:

var foo = 444;
var x = new Function('foo', "console.log('5'); console.log(foo);");
x(foo);

但这需要将所有内容作为单独的参数进行传递。太麻烦了。

我能想到的唯一替代方案是让一个容器对象保存每个变量,然后只传递那个容器:

var container = { };
container.foo = 444;
var x = new Function('container', "console.log('5'); console.log(container.foo);");
x(container);

但这需要将我的每个变量都放入容器中。

我不能这样做:

var x = new Function('container', "console.log('5'); console.log(" + foo + ");");

因为我需要在函数执行时评估CCD_ 2。声明x时不会。

我知道使用new Function使用eval,这通常是邪恶的。我正在编写一个代码解析器,并试图对其进行优化,所以我无论如何都在使用它。

一个简单的解决方案是将变量放在window

window.foo = 444;
window.foo2 = 555;
window.foo3 = 666;
var x = new Function("console.log('5'); console.log(window.foo);");
x();

另一个选项是使用另一个函数为您提供常数值

function globalContainer(){
    return {foo: 444, foo1: 555, foo2: 666};
}
var x = new Function("console.log('5'); console.log(globalContainer().foo);");
x();