Safari 中的 Eval 在正确的 es6 代码上抛出错误

Eval in safari throws error on proper es6 code

所以我有一段使用 es6 默认参数的完全合法的代码:

const foo = 5;
function test(bar = foo) { return bar };
test();

在 Safari 的控制台中执行时可以正常工作。

然而,同一段代码,当在 eval 函数中使用时,如下所示:

eval('const foo = 5; function test(bar = foo) { return bar }; test();');

抛出以下错误:

ReferenceError: Can't find variable: foo

我在使用 webpack sourcemaps (eval-source-map) 时偶然发现了这个,它生成像这样包装在 eval 中的代码,它破坏了生成的包。

我想知道为什么会出现这种不一致?

在 Safari v 10.1.2 中测试

这似乎是一个与块作用域 const / let 的使用以及代码在全局范围内评估的事实有关的错误。

我找到了两个解决方法:

1: 使用 var:

eval('var foo = 5; function test(bar = foo) { return bar }; test();');

2:使用const,但在闭包内执行。例如,IIFE 中的相同代码似乎可以工作:

eval('(function(){const foo = 5; function test(bar = foo) { return bar }; return test();})()');