评估和演示在Safari中抛出错误的正确ES6代码

问题描述:

所以我有这个完全合法的一段代码,使用ES6默认参数:评估和演示在Safari中抛出错误的正确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中,并且破坏了生成的包。

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

测试在Safari v 10.1.2

+2

似乎在Safari 11中工作,因此它可能只是一个错误。 – pvg

+0

看起来像一个与'const' /'let'关键字相关的错误。似乎在Safari 10中使用'var'工作。 –

+0

@PatrickKunka是的,它可以和var一起工作,好像可能是块范围变量 – Kicu

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