首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从函数访问ES6根常量

无法从函数访问ES6根常量
EN

Stack Overflow用户
提问于 2017-07-18 07:07:09
回答 1查看 68关注 0票数 1

我正在开发一个使用es2015的应用程序。理想情况下,我们只想编写es2015代码并在浏览器上运行该代码,因为我们面向的是支持es2015的浏览器。但是,我对Safari 10.1中的以下代码有一个问题:

代码语言:javascript
复制
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错误,并将在未来修复。

EN

回答 1

Stack Overflow用户

发布于 2017-07-18 09:39:14

这是在JSBin运行器中实际运行的代码:

代码语言:javascript
复制
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 block
  2. varXg()的范围为全局范围的

g()执行时,可以通过全局作用域使用varX。但是,没有在全局作用域上声明rootX,并且抛出了ReferenceError

注意:只需在Safari的js控制台中运行代码片段就可以了。而且,运行包含try-catch语句的代码片段会抛出rootXReferenceError

注意2:如果不使用全局作用域,代码将在Safari中运行。

代码语言:javascript
复制
(function() {
    const rootX = 1;
    var varX = 2;

    function g() {
        console.log('var inside : ', varX);
        console.log('const inside : ', rootX);
    }
    g();
})();

一种变通办法可能是将构建输出文件包装在一个生命周期中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45154965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档