2016-07-30 83 views
1

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

This Works。

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

console.log(Example); 

这没有。

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

console.log(Example); 

我收到此错误。

Uncaught ReferenceError: Example is not defined

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

回答

2

当你意识到这个答案变得相当清楚:

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

..becomes这样的:

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

这真的宣布xundefined之前评估表达式和设置x到结果。

然而,let不具有财产 - 这不是悬挂:

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

..gets评价这一点。

y不存在当你做(j => j)(y),所以它会引发一个引用错误。

+1

完美。感谢一堆@towerofnix :) –

1

var声明是hoisted,这意味着名称被认为是“声明”,但undefined直到整个功能范围内分配的(而不是块范围)。相反,ES6 let声明未被挂起,因此参考Example导致ReferenceError,因为尚未声明。

+0

非常感谢@ patrick-roberts :) –