Где я должен определить свое закрытие Javascript? - PullRequest
0 голосов
/ 11 февраля 2009

Я создаю свой собственный объект, подобный массиву JavaScript, и у меня есть методы, которые вызывают замыкания. Мне просто было интересно, где было наиболее эффективное место для определения замыкания.

Например, представьте, что у меня есть функция map и функция chop:

MyObject.prototype = 
{
  map: function(fn) { ... applies fn to each element ... };

  chop: function() 
  { this.map( 
    function(element) 
    {
      ... chop off last character ... 
    } 
  )};
}

Более эффективно сделать это вместо этого?

MyObject.prototype = 
{
  map: function(fn) { ... applies fn to each element ... };

  __chop: function(element) 
  {
    ... chop off last character ... 
  }

  chop: function() 
  { this.map(this.__chop) };
}

Ответы [ 4 ]

5 голосов
/ 11 февраля 2009

Второй более эффективен. Это

  chop: function() 
  { map( 
    function(element) 
    {
      ... chop off last character ... 
    } 
  )}

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

Я бы предложил следующий шаблон:

MyObject.prototype = (function() {

    function map(fn) { ... }

    function chopElement(element) { ... }

    function chop() {
        this.map(chopElement);
    }

    return {
        map : map,
        chop : chop
    };

})();
2 голосов
/ 11 февраля 2009

Ни создание функции, ни ее поиск не являются дорогостоящими операциями в JavaScript, поэтому, если у вас есть «массив» с приличным количеством элементов в нем, разница между обоими методами будет незначительной.

0 голосов
/ 15 октября 2010

Торговля закрытием функции для закрытия другой функции не приводит к более эффективному коду. Наиболее эффективным для памяти будет тот, который вообще не использует замыкания.

__proto__ = {
  map: function(){},
  _chop: function(str){
    return str.slice( str.length, -1 );
  },
  chop: function(arr){ 
    this.map(this._chop, arr);
  }
}

Этот вопрос очень высок в Google по поводу "использования памяти закрытия", я не думаю, что он подходит. Это проблема, которую трудно диагностировать, хотя.

Ответ здесь - это еще один пример сокрытия функциональности внутри замыкания, но он добавляет стоимость поддержки пространства памяти для хранения этих приватных переменных.

0 голосов
/ 11 февраля 2009

По сути, это одно и то же - идите с тем, что более читабельно. Из-за чего я предпочитаю второй.

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