Ты прав.Современные двигатели JS будут оптимизировать scope chain lookup
и prototype chain lookup
как много.Значит, AFAIK движок пытается удерживать какую-то хеш-таблицу с узлами доступа внизу.
Это работает, только если нет eval()
(подробно или неявно, например, setTimeout
) или try-catch
или a with statement
.Из-за таких конструкций интерпретатор не может быть уверен в том, как получить доступ к данным, и ему нужно «вернуться» в классический scope chain lookup
, что на самом деле означает, что он должен пролистать весь родительский контекст variable / activation objects
и попытаться разрешитьимя искомой переменной.Этот процесс, конечно, займет больше времени для объектов / имен, которые расположены «далеко» от того места, где был запущен обработанный поиск.Это, в свою очередь, означает, что доступ к данным на global object
всегда будет самым медленным.
В вашем фрагменте процесс поиска для a
будет выглядеть так:
anonymous function -> Execution Context -> Activation Object (not found)
anonymous function -> Execution Context -> [[ Scope ]]
- createFunctionWithClosure
- global scope
createFunctionWithClosure -> Activation Object (not found)
global scope -> Variable Object (found)
Описанная процедура поиска предназначена для ECMAscript Edition 262, 3-е издание.В ECMAscript edition 5 есть некоторые фундаментальные изменения.