我正在使用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();
在Safari 10.1中,我在第二个控制台输出行上收到“引用错误,无法找到变量:rootX”。这是正确的ES6行为吗?我似乎无法在网上找到任何人谈论这种情况。我的猜测是该函数在const
定义之上被提升,因此const
未定义。相同的代码适用于Chrome。
我能找到的唯一解决方法是使g
成为一个胖箭头功能。我会对此感到满意,除非我们使用的某些npm模块似乎也与此问题相冲突。这是es2015的预期行为吗?我可以期待图书馆作者将来会解决这些问题吗,或者我现在能做些什么来缓解这个问题呢?
你可以在这里试试: http://jsbin.com/taruwudufu/edit?html,js,output
更新:Safari Technology Preview不会抛出此错误,因此它看起来确实是一个Safari错误,并且将在未来修复。
答案 0 :(得分:1)
这是实际在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块varX
和g()
被提升并限定为全局范围 g()
执行varX
时,可通过全局范围获取。但是,rootX
未在全局范围内声明,并且会抛出ReferenceError
。
注意:只需在Safari的js控制台中运行代码段即可。并且,使用周围的try-catch语句运行代码段会为ReferenceError
引发rootX
。
注2:如果未使用全局范围,则代码在Safari中运行。
(function() {
const rootX = 1;
var varX = 2;
function g() {
console.log('var inside : ', varX);
console.log('const inside : ', rootX);
}
g();
})();
解决方法可能是将构建输出文件包装在IIFE中。