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();})()');
所以我有一段使用 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();})()');