将数据执行为代码
有几种方法可以将数据(代码的字符串)作为当前程序的一部分运行。
最明显的方法是特殊运算符eval,它将在当前作用域内执行一个字符串。 这通常是一个坏主意,因为它破坏了作用域通常拥有的一些属性,比如易于预测给定名称所引用的绑定。
const x = 1;function evalAndReturnX(code) {eval(code);return x;}console.log(evalAndReturnX("var x = 2"));// → 2console.log(x);// → 1
将数据解释为代码的不太可怕的方法,是使用Function构造器。 它有两个参数:一个包含逗号分隔的参数名称列表的字符串,和一个包含函数体的字符串。 它将代码封装在一个函数值中,以便它获得自己的作用域,并且不会对其他作用域做出奇怪的事情。
let plusOne = Function("n", "return n + 1;");console.log(plusOne(4));// → 5
这正是我们需要的模块系统。 我们可以将模块的代码包装在一个函数中,并将该函数的作用域用作模块作用域。
