Javascript 浏览器:已声明标识符X

Javascript 浏览器:已声明标识符X,javascript,ecmascript-6,Javascript,Ecmascript 6,在我的项目中,我将ES6与Babel一起使用,当我声明一个const 'use strict'; const APP = window.APP = window.APP || {}; const _ = window._; APP.personalCard = (function () { ... }()); 错误 未捕获的TypeError:标识符“APP”已声明 这就是整个文件,我在文件的其他地方没有声明。但是我已经在其他文件的顶部声明了var 您认为它应该是什么?请记住wi

在我的项目中,我将ES6与Babel一起使用,当我声明一个
const

'use strict';

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

APP.personalCard = (function () {

   ...

}());
错误

未捕获的TypeError:标识符“APP”已声明

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


您认为它应该是什么?

请记住
window
是全局名称空间。这两行试图声明相同的变量:

window.APP = { ... }
const APP = window.APP
strict
模式下不允许使用第二个定义(通过文件顶部的
'use strict'
启用)

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

但是我已经在其他文件的顶部声明了var

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

相反,请使用
var
,在主文件中只使用一个声明,或者只将其分配给
window.APP


或者立即使用ES6模块,并让您的模块绑定器/加载程序按照预期处理公开它们的问题。

我有一个非常接近的问题,但在我的情况下,它是
标识符“e”已经声明了

在我的例子中,由于使用
try{}catch(e){var e=…}
而导致的,其中字母
e
是通过minifier(uglifier)生成的

因此,更好的解决方案可能是使用
catch(ex){}
ex
作为
例外


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

window.APP=
是一个作业,而不是声明。它甚至在声明变量之前都不会执行。严格来说,这不是真的。真实ES6环境中的全局作用域let/const声明不会向全局对象添加属性,但会创建全局作用域绑定。