Зачем поднимать переменные, когда есть ТДЗ

В стандарте ES6 предусмотрены временные мертвые зоны, что делает ссылку на переменную невозможной до тех пор, пока не будет оценена лексическая привязка. Итак, что означает создание переменной во время инициализации лексической среды для

  1. Программист?
  2. Компилятор?

Объявление переменной с использованием объявления var могло означать что-то для программиста раньше, но теперь с TDZ начинает ли javascript вести себя как java для этой цели? Есть ли какая-то другая причина, кроме способа работы интерпретатора javascript, которую мы поднимаем (в результате TDZ) в первую очередь?

Что происходит, когда лексическая привязка встречается позже в коде из-за порядка выполнения, даже если код появляется раньше, чем он лексически?

let abc = f();
let b;
f(){ return b;}

Когда традиционные языки программирования, такие как java, создают переменные? Когда встречается объявление переменной? или когда инициализируется лексическая область видимости?


person sasidhar    schedule 22.01.2016    source источник
comment
возможно, из-за большого количества вопросов, которые Google может решить в большинстве   -  person Vitaliy Terziev    schedule 27.01.2016
comment
не совсем, я пробовал большинство из них, например, когда такой язык, как java, создает переменные, и пришел с пустыми руками. Большинство ресурсов TBZ с хорошим объяснением, но они не могут объяснить, зачем нам это вообще нужно, потому что теперь не имеет значения, поднимаются ли переменные (только элементы с блокировкой)   -  person sasidhar    schedule 27.01.2016
comment
@sasidhar, есть несколько разных шагов для создания переменной. Вы про то, когда они распознаются как переменные? Вы говорите о том, когда их адресные пространства в памяти заполняются? Многие языки создают переменные по-разному, и вы должны посмотреть, как каждый из них трактуется в контексте языка.   -  person Jay    schedule 02.02.2016
comment
Я не думаю, что es6 сильно изменится, только проясняет его и применяет к блокам вместо функций при использовании let. посмотрите, как в выводе js сценария coffee перечислены все вары вверху, и представьте, что функции js внутри делают то же самое. переменная видна, но пуста, пока вы не присвоите ей значение.   -  person dandavis    schedule 03.02.2016
comment
@dandavis Я не согласен, es6 оказывает существенное влияние, TDZ теперь делает typeof валидацию невозможной. TDZ - это принудительное изменение, если бы это было не так, это был бы простой случай изменения функциональной области на область блока.   -  person sasidhar    schedule 03.02.2016
comment
не могли бы вы представить нам пример того, как typeof меняется?   -  person dandavis    schedule 03.02.2016


Ответы (2)


У меня такое чувство, что создание TDZ было связано с тем, что это был очень простой шаг от var, тогда как, если бы они пошли с, казалось бы, более логичным подходом, даже не имея идентификатора, движку пришлось бы пройти даже более интенсивные изменения. Что касается второй части вашего вопроса, касающейся того, когда другие языки «создают» переменные, есть много других важных факторов, которые вы, кажется, упустили, например, интерпретируемый или скомпилированный язык, а также наличие нескольких различные шаги для «создания» переменной. Он действует по-разному во многих разных случаях, и однозначного ответа на него нет. Фактически, это одна из главных причин, по которой существует много разных языков.

Что касается вашего вопроса о кодировании, это будет зависеть от того, когда вы вызываете свою функцию f, поскольку объявления функций поднимаются в javascript. Если вы вызываете его до объявления b, значит, вы находитесь в TDZ и на b нельзя ссылаться. Он будет вести себя так же, как если бы вы просто помещали return b везде, где вызывается эта функция.

Честно говоря, кажется, что в основе лежит какое-то непонимание javascript и компьютерных языков в целом. Javascript не «ведет себя» больше как java, на самом деле новое ключевое слово let имеет очень тонкое поведение, например, возможность блокировать область видимости по сравнению с объявлениями типов / переменных в java. Я бы посоветовал не думать об изменениях в ES6 с точки зрения других языков; javascript не похож на многие другие языки, будет очень сложно понять концепции и то, как вы должны программировать с помощью javascript, если вы это сделаете.


РЕДАКТИРОВАТЬ:

Что касается того, почему существует подъем объявления переменных и функций, это легко найти в Google.

person Jay    schedule 01.02.2016

Итак, что означает для программиста создание переменной во время инициализации лексической среды?

Немного. Программист намеревается использовать только объявленные и инициализированные переменные.

То, что переменная доступна во всей области (с самого начала), означает только то, что ошибки будут легче обнаруживаться, поскольку использование переменной до инициализации завершается неудачно (за исключением) вместо того, чтобы молча разрешить ее во внешнюю область (глобальную ?) Переменная. Это также означает, что идентификатор, независимо от того, где он используется в области видимости, всегда ссылается на локальную переменную, чего мы и ожидаем от области видимости.

Итак, что означает для компилятора создание переменной во время инициализации лексической среды?

Что лексическая среда не меняет своей структуры во время выполнения. Статическое разрешение идентификаторов в известной области делает возможной компиляцию и выполнение быстрее.

В качестве контрпримера рассмотрим вот что:

var x = "global";
var code = "var x = 'local';";
(function() {
     "use sloppy";
     function test() {
         console.log(x); // what do you think does `x` refer to?
     }                   // It's hard to understand as a developer,
                         // now imagine being a compiler that tries to optimise `test`.
     test();
     eval(code);
     test();
}());

Что происходит, когда лексическая привязка встречается позже в коде из-за порядка выполнения, даже если код появляется раньше, чем он лексически?

b используется вызовом f() перед его инициализацией. Доступ к нему вызывает исключение TDZ.
Вы можете попробовать это в Интернете.

person Bergi    schedule 27.01.2016