我正在开发一个使用es2015的应用程序。理想情况下,我们只想编写es2015代码并在浏览器上运行该代码,因为我们面向的是支持es2015的浏览器。但是,我对Safari 10.1中的以下代码有一个问题:
const rootX = 1;
var varX = 2;
function g(){
console.log('var inside : ', varX);
console.log('const inside : ', rootX);
}
g();在Safari10.1中,我在第二个控制台输出行得到"Reference error,can't find variable: rootX“。这是正确的ES6行为吗?我似乎在网上找不到任何人在谈论这个场景。我的猜测是该函数被提升到const定义之上,因此const是未定义的。同样的代码也可以在Chrome中运行。
我能找到的唯一解决办法是让g成为一个胖箭头函数。我对此没有意见,但似乎我们使用的一些npm模块也会与这个问题发生冲突。这是es2015的预期行为吗?我能期望库作者在将来修复这些问题吗,或者我现在能做些什么来缓解这个问题吗?
你可以在这里尝试一下:http://jsbin.com/taruwudufu/edit?html,js,output
更新: Safari技术预览版没有抛出这个错误,所以它看起来确实是一个Safari错误,并将在未来修复。
发布于 2017-07-18 09:39:14
这是在JSBin运行器中实际运行的代码:
try {
const rootX = 1;
var varX = 2;
function g() {
window.runnerWindow.proxyConsole.log('var inside : ', varX);
window.runnerWindow.proxyConsole.log('const inside : ', rootX);
}
g();
} catch (error) {
throw error;
}我认为这里可能发生的事情是:
rootX的范围为try blockvarX,g()的范围为全局范围的当g()执行时,可以通过全局作用域使用varX。但是,没有在全局作用域上声明rootX,并且抛出了ReferenceError。
注意:只需在Safari的js控制台中运行代码片段就可以了。而且,运行包含try-catch语句的代码片段会抛出rootX的ReferenceError。
注意2:如果不使用全局作用域,代码将在Safari中运行。
(function() {
const rootX = 1;
var varX = 2;
function g() {
console.log('var inside : ', varX);
console.log('const inside : ', rootX);
}
g();
})();
一种变通办法可能是将构建输出文件包装在一个生命周期中。
https://stackoverflow.com/questions/45154965
复制相似问题