ES6中的模块模式错误(扩充)

在使用模块模式(扩充)与ES6 let关键字时出现错误。

这工作。

var Example = ( Example => { Example.name = ""; return Example; })( Example || {} ); console.log(Example); 

这不是。

 let Example = ( Example => { Example.name = ""; return Example; })( Example || {} ); console.log(Example); 

我得到这个错误。

未捕获的ReferenceError:示例未定义

 })( Example || {} ); ^^^^^^^ 

当你意识到这一点时,答案变得相当清楚:

 var x = (j => j)(x) 

..becomes这个:

 var x = undefined x = (j => j)(x) 

评估expression式并将x设置为结果之前,它确实将x声明为undefined

然而, let没有这个属性 – 它不是悬挂的:

 let y = (j => j)(y) 

..gets就是这样评估的。

(j => j)(y)y不存在,所以抛出一个引用错误。

var声明被挂起 ,这意味着这个名字被认为是“声明的”,但是undefinedundefined直到在整个函数范围内(与块范围相对)被分配为止。 相反,ES6 let声明不会被提升,所以引用Example会导致ReferenceError因为它还没有被声明。