2010-01-30 6 views
0

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

Мне было интересно, был ли способ, с помощью которого я мог бы упростить привязку анонимных функций к классу? Я продолжаю забывать добавить привязку в конце. Или это так, как это делается все время?

var arr = this.getSomeArray(); 
arr.each(function(t) { 
    t.update(val); 
    this.updateJSValue(t); 
}.bind(this)); 

ответ

1

Ваши варианты в основном вызвать некоторую функцию (bind, addMethods или другую функцию, вы пишете) или использовать локальную переменную, а не this:

var self=this; 
arr.each(function(t) { 
    t.update(val); 
    self.updateJSValue(t); 
}); 

Если у Вас есть большое количество функций , локальная переменная требует наименьшего набора текста. Для всего лишь нескольких функций разница не слишком велика.

function ThingMixin(self) { 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
}; 
... 
ThingMixin(Ralph.prototype); 

// or an anonymous function: 
(function (self){ 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
})(Ralph.prototype); 
+0

есть ли какой-либо рост производительности/уменьшение с использованием локальной переменной? Большинство мест, где они происходят, находятся в двойном порядке для петель. – Casey

+0

Я ожидаю, что использование памяти немного увеличится, поскольку переменные будут жить дольше из-за закрытия, но влияние на производительность должно быть незначительным. Обратите внимание, что 'bind' скорее всего использует локальную переменную. – outis

+0

Этот комментарий больше связан с правильностью, чем с эффективностью, но если вы хотите привязываться к одному и тому же объекту для каждой итерации, установите 'self' вне цикла, и влияние производительности будет незаметным; если вы хотите привязываться к другому объекту, объявляйте 'self' внутри блока цикла. – outis

Смежные вопросы