Javascript 浏览器:已声明标识符X
在我的项目中,我将ES6与Babel一起使用,当我声明一个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
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声明不会向全局对象添加属性,但会创建全局作用域绑定。