1

下面是我的代码:

<!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>

如果在声明之前使用了let-var,es6中的临时放置区(TDZ)似乎应该抛出一个referenceError。

但是,在此示例中,我的 let 未定义。我哪里错了?

解决这个问题很久了,浪费了一天的时间。(任何指针都会很有帮助)。我正在使用 Chrome v58。

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

我剥离了 traceur 部分并发布在 babel-try it out 上,得到了相同的结果。在此处输入图像描述

我想知道为什么它在我的 chrome v58 中不起作用。也许它还需要其他东西?

4

2 回答 2

0

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

铬版 v58

于 2017-06-05T09:00:51.593 回答
0

您正在使用 Traceur,它不支持 let/const 的 TDZ。它将转换letvar- 使 let 的 TDZ 行为与您的 var 示例相同。在 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';
}());

于 2017-06-05T08:09:30.420 回答