Safari中的Eval会在正确的es6代码上引发错误

时间:2017-09-14 16:15:50

标签: javascript safari ecmascript-6 eval

所以我拥有使用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:找不到变量:foo

我在使用webpack源图(eval-source-map)时偶然发现了这一点,这些源图生成了包含在eval中的代码,并且它会破坏生成的包。

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

在Safari v 10.1.2中测试

1 个答案:

答案 0 :(得分:0)

这似乎是与使用块范围的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();})()');