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