使用带有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 || {} );
^^^^^^^
答案 0 :(得分:3)
当你意识到这一点时,答案就变得相当清楚了:
var x = (j => j)(x)
..变成了这个:
var x = undefined
x = (j => j)(x)
在评估表达式并将x
设置为结果之前,它确实将undefined
声明为x
。
但是,let
没有该属性 - 它没有被提升:
let y = (j => j)(y)
..得到了评估。
执行y
时 (j => j)(y)
不存在,因此会引发参考错误。
答案 1 :(得分:1)
var
声明为hoisted,意味着该名称被视为“声明”,但undefined
直到在整个函数范围内分配(与块范围相对)。相反,ES6 let
声明未被提升,因此引用Example
会导致ReferenceError
,因为它尚未声明。