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

时间:2016-07-30 23:20:10

标签: javascript node.js ecmascript-6 babeljs

使用带有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 || {} );
    ^^^^^^^

2 个答案:

答案 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,因为它尚未声明。