将数据执行为代码

有几种方法可以将数据(代码的字符串)作为当前程序的一部分运行。

最明显的方法是特殊运算符eval,它将在当前作用域内执行一个字符串。 这通常是一个坏主意,因为它破坏了作用域通常拥有的一些属性,比如易于预测给定名称所引用的绑定。

  1. const x = 1;
  2. function evalAndReturnX(code) {
  3. eval(code);
  4. return x;
  5. }
  6. console.log(evalAndReturnX("var x = 2"));
  7. // → 2
  8. console.log(x);
  9. // → 1

将数据解释为代码的不太可怕的方法,是使用Function构造器。 它有两个参数:一个包含逗号分隔的参数名称列表的字符串,和一个包含函数体的字符串。 它将代码封装在一个函数值中,以便它获得自己的作用域,并且不会对其他作用域做出奇怪的事情。

  1. let plusOne = Function("n", "return n + 1;");
  2. console.log(plusOne(4));
  3. // 5

这正是我们需要的模块系统。 我们可以将模块的代码包装在一个函数中,并将该函数的作用域用作模块作用域。