Javascript 如何构建访问外部变量的函数对象?

Javascript 如何构建访问外部变量的函数对象?,javascript,ecmascript-6,Javascript,Ecmascript 6,我需要执行包含在字符串中的代码,为了符合使用函数对象而不是eval()的指示,我编写了以下代码(简化): 常数a=10; 常数b=10; 函数convertCodeToObject(代码) { 返回函数(''use strict';返回('+code+');')(); } 函数main() { 常数c=convertCodeToObject('a+b'); 控制台日志(c); } main()考虑以下测试: 函数test1() { 变量a=1,b=1; 函数运行(代码) { var isS

我需要执行包含在字符串中的代码,为了符合使用函数对象而不是eval()的指示,我编写了以下代码(简化):

常数a=10;
常数b=10;
函数convertCodeToObject(代码)
{
返回函数(''use strict';返回('+code+');')();
}
函数main()
{
常数c=convertCodeToObject('a+b');
控制台日志(c);
}

main()
考虑以下测试:


函数test1()
{
变量a=1,b=1;
函数运行(代码)
{
var isStrict=(函数(){return!this;})();
log(“测试1是严格的:+isStrict”);
返回评估(代码);
}
回程(“a+b”);
}
函数test2()
{
变量a=1,b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
log(“测试2是严格的:+isStrict”);
返回评估(代码);
}
回程(“a+b”);
}
函数test3()
{
变量a=1,b=1;
函数运行(代码)
{
var isStrict=(函数(){return!this;})();
日志(“测试3是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数test4()
{
变量a=1,b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
日志(“测试4是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数test5()
{
窗口a=1,窗口b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
日志(“测试4是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数onload()
{
尝试{console.log(“test1”+test1());}catch(ex){console.log(“test1”+ex);}
尝试{console.log(“test2”+test2());}catch(ex){console.log(“test2”+ex);}
尝试{console.log(“test3”+test3());}catch(ex){console.log(“test3”+ex);}
尝试{console.log(“test4”+test4());}catch(ex){console.log(“test4”+ex);}
尝试{console.log(“test5”+test5());}catch(ex){console.log(“test5”+ex);}
}

考虑以下测试:


函数test1()
{
变量a=1,b=1;
函数运行(代码)
{
var isStrict=(函数(){return!this;})();
log(“测试1是严格的:+isStrict”);
返回评估(代码);
}
回程(“a+b”);
}
函数test2()
{
变量a=1,b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
log(“测试2是严格的:+isStrict”);
返回评估(代码);
}
回程(“a+b”);
}
函数test3()
{
变量a=1,b=1;
函数运行(代码)
{
var isStrict=(函数(){return!this;})();
日志(“测试3是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数test4()
{
变量a=1,b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
日志(“测试4是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数test5()
{
窗口a=1,窗口b=1;
函数运行(代码)
{
“严格使用”;
var isStrict=(函数(){return!this;})();
日志(“测试4是严格的:+isStrict”);
返回新函数(`return(${code})`)();
}
回程(“a+b”);
}
函数onload()
{
尝试{console.log(“test1”+test1());}catch(ex){console.log(“test1”+ex);}
尝试{console.log(“test2”+test2());}catch(ex){console.log(“test2”+ex);}
尝试{console.log(“test3”+test3());}catch(ex){console.log(“test3”+ex);}
尝试{console.log(“test4”+test4());}catch(ex){console.log(“test4”+ex);}
尝试{console.log(“test5”+test5());}catch(ex){console.log(“test5”+ex);}
}

Function构造函数创建一个不在本地上下文中运行的函数。因此,除了把所有东西都放在全球环境中之外,你真的不可能做你想做的事情,这是一个坏主意。然而,这看起来像-你到底想做什么,为什么你需要为它自动生成代码?你们不能用更成熟的方法来生成新函数吗?@VLAZ我为自己在JS中的不善道歉,我已经十多年没用过它了。在我的例子中,我认为a和b在全球范围内?你是说ES6和/或Webpack创建了一个不同的上下文,这就是为什么它在代码段中作为独立代码而不是在我的环境中工作的原因吗?是否可以通过bind()传递当前上下文@VLAZ在我的具体案例中,没有太多的替代方案,我将JS代码片段作为字符串从C#中发送。Re全局上下文-
a
b
将与之隔离。任何绑定器都会尝试确保至少使用包含在函数上下文中包装代码的代码,从而将其从全局上下文中删除。这是一个很好的实践,因为它可以确保两个不同的模块在重复使用相同的变量名时不会发生冲突。现在有直接的支持做sa