以下是我的代码:
<!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上 - 尝试一下,得到了相同的结果。
我想知道为什么它不适用于我的chrome v58。也许它还需要别的东西?
答案 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