Полный ответ на этот вопрос будет очень длинным. Поэтому я постараюсь объяснить только несколько вещей. Во-первых, возможно, самый важный факт, даже если вы объявляете переменную с var
, это зависит от того, где вы это делаете. В глобальной области вы также неявно записали бы эту переменную в объект, большинство браузеров называют ее window
. Так например
// global scope
var x = 15;
console.log( window.x ); // 15
Если мы делаем то же самое в контексте функции, все меняется. В контексте функции мы записали бы имя этой переменной в ее так называемый «объект активации». То есть внутренний объект, который обрабатывает движок js для вас. Все формальные параметры, объявления функций и переменные хранятся там.
Теперь, чтобы ответить на ваш актуальный вопрос: в контексте функции всегда самый быстрый доступ к переменным, объявленным с var
. Это опять-таки не обязательно верно, если мы находимся в глобальном контексте. Глобальный объект очень большой, и он не очень быстрый, чтобы получить доступ к чему-либо внутри.
Если мы храним вещи внутри объекта, это все еще очень быстро, но не так быстро, как переменные, объявленные var
. Особенно времена доступа увеличиваются. Но, тем не менее, мы говорим о микро и наносекундах здесь (в современных реализациях браузера). Старые браузеры, особенно IE6 + 7, имеют огромные потери производительности при доступе к свойствам объекта.
Если вы действительно заинтересованы в таких вещах, я рекомендую книгу Николаса С. Закаса «1014 * High Performance Javascript ». Он измерил множество различных методов для доступа и хранения данных в ECMAscript для вас.
Опять же, различия в производительности для поиска объектов и переменных, объявленных var
, практически не поддаются измерению в современных браузерах. Старые браузеры, такие как FF3 или IE6, демонстрируют принципиально низкую производительность для поиска / доступа к объектам.