ES6 root consts无法通过函数

时间:2017-07-17 23:07:09

标签: javascript safari ecmascript-6

我正在使用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错误,并且将在未来修复。

1 个答案:

答案 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;
}

我能看到的可能是:

  1. rootX的范围是try块
  2. varXg()被提升并限定为全局范围
  3. 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中。