Читая книгу Кайла Симпсона «Вы не знаете JS: Scopes & Closures», он утверждает, что вы должны держаться подальше как от функции eval()
, так и от ключевого слова with
, потому что всякий раз, когда компилятор видит эти 2 (я перефразирую), он не выполняет некоторые действия. оптимизация, связанная с лексической областью и сохранением местоположения идентификаторов, потому что эти ключевые слова могут потенциально изменить лексическую область, что делает оптимизацию компилятора некорректной (я предполагаю, что оптимизация похожа на компилятор, сохраняющий местоположение каждого идентификатора, чтобы он мог предоставить значение идентификатора без его поиска, когда он запрашивается во время выполнения).
Теперь я понимаю, почему это произошло, когда вы использовали ключевое слово eval()
: ваш eval мог оценивать пользовательский ввод, и этот пользовательский ввод мог быть объявлением новой переменной, которая затеняет другую переменную, к которой вы обращаетесь позже, скажем, в функции, которая выполняется, если бы компилятор сохранил статическое местоположение, доступ вернул бы значение неправильного идентификатора (поскольку доступ должен был вернуть значение идентификатора, объявленного eval()
, но он вернул значение переменной, которая была хранится компилятором для оптимизации поиска). Поэтому я просто предполагаю, что именно поэтому компилятор не выполняет поиск, связанный с областью видимости, всякий раз, когда он обнаруживает eval()
в вашем коде.
Но почему компилятор делает то же самое для ключевого слова with
? В книге говорится, что это происходит потому, что with
создает новую лексическую область во время выполнения и использует свойства объекта, переданного в качестве аргумента with
, для объявления некоторых новых идентификаторов. Я буквально понятия не имею, что это значит, и мне очень трудно визуализировать все это, поскольку все, что связано с компилятором в этой книге, — это сплошная теория.
Я знаю, что могу быть на неправильном пути, в таком случае, пожалуйста, исправьте все мои недоразумения :)
with
. На какой из этих вопросов есть ответ в этой статье? - person doubleOrt   schedule 11.09.2017with
в 2017 году не в оптимизации, а в том, что мы пишем код строгого режима или ES6, в котором это даже нелегально. - person   schedule 11.09.2017with
, все они упускают одно из самых важных:with
ухудшает производительность. Я просто спрашиваю, почему. - person doubleOrt   schedule 11.09.2017