暂时死区(ES6)似乎不起作用

时间:2017-06-05 07:59:57

标签: javascript ecmascript-6 babeljs iife traceur

以下是我的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<h1 id="message"></h1>

<script src="traceur/traceur.js"></script>
<script src="traceur/BrowserSystem.js"></script>
<script src="traceur/bootstrap.js"></script>
<script type="module">

    var x = 'outer scope';
    (function() {
        console.log(x); //Expected undefined, got undefined ! this is as expected.
        var x = 'inner scope';
    }());

    //same as above, but changed to var to let and x to y
    let y = 'outer scope';
    (function() {
        console.log(y); //Was expecting ReferenceError here, but got undefined. WTF ??!!!
        let y = 'inner scope';
    }());


</script>

</body>
</html>

似乎es6中的临时删除区(TDZ)应该抛出referenceError,以防在声明之前使用let-var。

然而,在这个例子中,我得到了未定义的let。 我哪里错了?

长期以来一直处于这个问题,浪费了一天。 (任何指针都会非常有帮助)。我正在使用Chrome v58。

v58在当前浏览器下具有https://kangax.github.io/compat-table/es6/的es6兼容性。)

我脱掉了跟踪部分并张贴在babel上 - 尝试一下,得到了相同的结果。 enter image description here

我想知道为什么它不适用于我的chrome v58。也许它还需要别的东西?

2 个答案:

答案 0 :(得分:0)

您正在使用Traceur,does not support TDZ for let/const。它会将let转换为var - 使得TDZ行为与let示例相同。在兼容ES6的环境中运行相同的代码,您将看到预期的结果:

var x = 'outer scope';
(function() {
    console.log(x);
    var x = 'inner scope';
}());

let y = 'outer scope';
(function() {
    console.log(y);
    let y = 'inner scope';
}());

答案 1 :(得分:0)

我删除了转换器代码并启用了JS中的实验功能 chrome:// flags / #enable-javascript-harmony here,现在按预期工作。

Chrome版本v58