2015-12-11 8 views
5

Я попытался выполнить следующий код в Firefox V30.0 блокнота:ReferenceError не кидает при обращении к 'давайте переменную до объявления

function do_something() { 
    console.log(foo); // ReferenceError 
    let foo = 2; 
} 
do_something(); 

Ожидаемое поведение является то, что моя программа должна бросить ссылки Ошибка, потому что Я обращаюсь к переменной let перед ее объявлением. Но, я не получаю ожидаемое поведение, программа получила казнены и результат, как показано ниже

undefined 

Можете ли вы объяснить мне, почему он ведет себя так?

+0

Насколько я знаю, 'let' объявленные переменные все еще подняты, то же самое, что и' var', вплоть до вершины их блока, а не функции. –

+0

@JamesThorpe - декларации поднимаются, но из-за временной мертвой зоны любая попытка ссылаться на них перед их инициализацией должна бросать. –

+0

вы можете запустить код в «строгом режиме» и посмотреть, что-то изменится, на мой взгляд, ожидаемый результат - это выбросить ... переменное значение должно произойти, только если вы используете ключевое слово var ... – Hitmands

ответ

6

Согласно MDN compatibility table, Firefox поддерживает семантику временной мертвой зоны только с v35.

Также вы всегда должны быть уверены, что используете строгий режим. Некоторые функции ES6 недоступны в неаккуратном режиме из-за опасений по поводу нарушения устаревшей сети. Он не должен влиять на этот конкретный случай, несмотря на то, что Firefox уже имеет длинную историю использования let.

4

Пусть переменные в ES6 подняты в верхнюю часть блока, где они объявлены. Ссылка на переменную перед ее объявлением приведет к ReferenceError (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let). Таким образом, вы правильно ожидаете, что в этом случае произойдет запуск ReferenceError.

Причина, по которой ReferenceError в этом случае не происходит, заключается в том, что FF 30 не поддерживает так называемую «временную мертвую зону». Хорошим местом для выяснения того, поддерживают ли браузер определенные части спецификации ES6, является таблица совместимости Ecmascripts от Kangax (https://kangax.github.io/compat-table/es6/#test-let).