Шаблоны JS с замыканиями и производительностью
У меня есть сомнения по поводу шаблонов и производительности JS, после того, как Дуглас Крокфорд прочитал "Javascript: Хорошие части", вы получили представление о том, как работает Closures, и в первую очередь подумайте о написании такого кода
(function(){
"use strict";
var OpenSloth = {};
OpenSloth.someFunction = function () {...};
OpenSloth.someOtherFunction = function () {...};
window.OpenSloth;
})();
Но я прочитал последнюю книгу под названием "Высокопроизводительный Javascript" Николаса С. Закаса (также О'Рейли), и они говорят со страницы 24–25:
Замыкания являются одним из наиболее мощных аспектов Javascript, позволяя функции получать доступ к данным за пределами своей локальной области видимости. Использование Cloasures было популяризировано в трудах Дугласа Крокфорда и теперь широко распространено в самых сложных веб-приложениях. Тем не менее, есть влияние на производительность, связанную с использованием замыканий...
... Поскольку свойство [[Scope]] замыкания содержит ссылки на те же объекты, что и цепочка областей действия контекста выполнения, существует побочный эффект. Как правило, объект активации функции уничтожается, когда уничтожается контекст выполнения. Когда задействовано замыкание, объект активации не уничтожается, потому что ссылка все еще существует в свойстве замыкания [[Scope]]. Это означает, что замыкания требуют больше ресурсов памяти в скрипте, чем функция без раскрытия...
Высокопроизводительный JavaScript, автор Николас С / Закас. Copyright 2010 Yahoo!, Inc, 978-0-596-80279-0."
После этого я хочу уменьшить замыкания настолько, насколько смогу, тогда я пришел к такому решению:
var OpenSloth = {};
OpenSloth._someFunction = function () {
"use strict";
...
};
OpenSloth._someOtherFunction = function () {
"use strict";
...
};
Но я хочу знать, каковы соглашения об этом, я пишу плохой код с этим вторым вариантом? и почему? это анти-паттерн?
Спасибо за ваше время.
1 ответ
Что ж, замыкания дают вам возможность писать модульный код, поэтому вы не будете сталкиваться с одними и теми же переменными в разных местах. Вы используете только те переменные, которые хотите, и не можете получить к ним доступ извне. Это безопаснее. Во втором вашем примере я бы сначала проверил, не используется ли объект, который вы хотите использовать, например, var OpenSloth = OpenSloth || {}; надеюсь это поможет