временная мертвая зона (ES6) не работает

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>

Кажется, что временная зона сброса (TDZ) в es6 должна бросать referenceError в случае, если let-var используется до его объявления.

Однако, в этом примере, я получаю undefined для let. Где я иду не так?

Был на эту проблему в течение долгого времени и потратил впустую день на это. (Любые указатели будут очень полезны). Я использую Chrome v58.

v58 имеет совместимость с es6 в соответствии с https://kangax.github.io/compat-table/es6/ в текущем браузере).

Я снял часть трассировки и выложил на babel - попробуйте, и получил тот же результат. Изображение 174551

Интересно, почему он не работает в моем chrome v58. Может быть, это требует чего-то еще?

Теги:
ecmascript-6
babeljs
iife
traceur

2 ответа

0

Я удалил код транспилятора и включил экспериментальные функции в JS chrome://flags/# enable-javascript-harmony здесь, и теперь он работал как ожидается.

Версия Chrome v58

0

Вы используете Traceur, который не поддерживает TDZ для let/const. Он преобразует let в var - создание поведения 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';
}());
  • 0
    какой браузер и его версию вы используете? Я оценил свой Chrome v 58 и использовал kangax.github.io/compat-table/es6 (в текущем браузере) и похоже, что он совместим с ES6.
  • 0
    Chrome 58 тоже. Вы нажимали кнопку « Выполнить фрагмент кода» выше? Должен показать правильный результат ниже
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню