Объект переменной глобального контекста Javascript или объект активации функции - PullRequest
2 голосов
/ 17 июня 2011

Вот два примера кода js:

A. Функция _foo определена в глобальном контексте

  function _foo(){ //some code here
  }

  //... some unrelated code here

  var foo = function(){
    var result = _foo();
    return result;
  }

B. Функция _foo определена в контексте функции

var foo = function(){
  function _foo(){ //some code here 
  }

  var result = _foo();
  return result;
};

Какой из них является лучшей практикой программирования с точки зрения управления памятью? Поскольку функция foo будет вызываться много раз в приложении, лучше ли сохранять _foo в глобальном контексте (приложения) и не создавать ее в контексте функции каждый раз, когда вызывается foo? Или, поскольку _foo будет (в основном) использоваться внутри foo, имеет ли смысл оставлять его частью объекта активации?

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

C: Кэширование

var foo = (function(){
  function _foo(){ //some code here 
  }
  return function() {
    var result = _foo();
    return result;
  }
}());

Foo выполняется немедленно, а функция _foo объявляется только один раз.

В современных браузерах это на 5% медленнеезатем «глобальная» функция.

Соответствующий Контрольный показатель

1 голос
/ 17 июня 2011

Чтобы ответить на ваш вопрос напрямую, если вам придется создавать экземпляр объекта foo каждый раз, когда вы хотите вызвать его, тогда объявление его в глобальной области видимости, безусловно, будет более быстрой альтернативой.

Однако в JavaScript почти наверняка будут более быстрые победы с точки зрения производительности, чаще всего относящиеся к взаимодействию DOM.

В таких примерах я бы порекомендовал вам придерживаться лучших практик программирования. Что бы вы сделали, если бы это был C #, Java или какой-то другой более строго типизированный язык? Ну, вы не сможете объявить глобальную функцию, поэтому поместите ее в класс, либо как статический метод, либо как открытый метод:

var foo = function(){};

//static method
foo._foo = function(){
    alert("_foo");
};

//public method
foo.prototype._foo2 = function(){
    alert("_foo2");
};

//calling static method
foo._foo();

//instantiating and calling public method:
var f = new foo();
f._foo2();

//note: this won't work (as we would expect!)
foo._foo2();

Большинство подобных вещей - это компромисс, предпочтение отдается стилю и структуре, а не производительности.

0 голосов
/ 17 июня 2011

Попробуйте создать свои функции в глобальном контексте и использовать функции замыкания в качестве асинхронных обратных вызовов, специфичных для исходного функционального запроса.Потенциально вы можете получить неприятные утечки памяти при слишком большом количестве анонимных вызовов функций, потому что javascript будет удерживать переменные верхнего уровня, которые вы используете в замыкании.

Возможно, вы также захотите использовать функции замыкания, если вы пытаетесьдизайн в ОО стиле для частных пользователей.Выполните поиск в Google / Stackoverflow по «объектно-ориентированному javascript», и вы получите дополнительную помощь по дизайну по этой конкретной теме.

Цитата из MDN:

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

Затворы могут занимать много памяти.Память может быть освобождена только тогда, когда возвращаемая внутренняя часть больше не доступна ... Из-за этой неэффективности избегайте замыканий всякий раз, когда это возможно, то есть избегайте вложенных функций, когда это возможно.

Опять же, учитывая, что дизайн ОО хорош... обертывание ваших функций в объект, чтобы вы могли вызывать их статически или через ссылку на объект, также является хорошим дизайном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...