【问题标题】:Browser: Identifier X has already been declared浏览器:标识符 X 已被声明
【发布时间】:2016-07-08 12:08:13
【问题描述】:

我在我的项目中使用 ES6 和 Babel,当我声明我的 const 之一时出现错误

'use strict';

const APP = window.APP = window.APP || {};
const _ = window._;

APP.personalCard = (function () {

   ...

}());

错误

未捕获的类型错误:标识符“APP”已被声明

这就是整个文件,我在该文件的其他任何地方都没有声明。但是我已经在其他文件的顶部声明了这个 var。

你觉得应该是什么?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    我有一个非常接近的问题,但就我而言,它是Identifier 'e' has already been declared

    在我的情况下,由于使用了 try {} catch (e) { var e = ... },其中字母 e 是通过缩小器(uglifier)生成的。

    所以更好的解决方案是使用catch(ex){}ex 作为Excemption

    希望搜索过类似问题的人会发现这个问题有帮助。

    【讨论】:

      【解决方案2】:

      但我已在其他文件的顶部声明了该 var。

      这就是问题所在。毕竟,这会在同一个(全局)范围内对同一个名称进行多个声明 - 这将引发 const 错误。

      改为使用var,在主文件中仅使用一个声明,或仅分配给window.APP
      或者立即使用 ES6 模块,并让您的模块捆绑器/加载器按预期处理它们。

      【讨论】:

        【解决方案3】:

        请记住,window 是全局命名空间。这两行试图声明同一个变量:

        window.APP = { ... }
        const APP = window.APP
        

        strict 模式下不允许第二个定义(在文件顶部使用'use strict' 启用)。

        要解决此问题,只需删除 const APP = 声明即可。该变量仍然可以访问,因为它属于全局命名空间。

        【讨论】:

        • window.APP = 是一个赋值,而不是一个声明。它甚至在声明变量之前都不会执行。
        • 这并不完全正确。真实 ES6 环境中的全局范围的 let/const 声明不会向全局对象添加属性,但它们会创建全局范围的绑定。
        猜你喜欢
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 2021-03-28
        相关资源
        最近更新 更多