2015-08-14 6 views
0
var that = this; 

for(var i=0;i<x;++i){ 
// some code 
events={ 
    click: function(event){ 
    that.doClick(event,this); 
} 
} 
} 

Теперь с приведенным выше кодом я получаю ошибку JShint «Не выполняйте функции в цикле».передать событие другой функции

Для устранения указанной выше ошибки я делаю это сейчас

var that = this; 
    function clickHandler() { 
       return function() { 
        that.doClick(this); 
       }; 
      } 

for(var i=0;i<x;++i){ 
// some code 
events={ 
    click: clickHandler() 
} 
} 

ли этот штраф? Если да, то как я могу передать событие из события щелчка в clickHandler, а затем сделать doClick funciton

+0

Там нет никакой разницы в первый кусок кода в секунду, за исключением вашей второй вы не пройти 'clickHandler' - вы выполняете его и присвоить результат' click'. – tymeJV

+0

Как я могу передать событие doClick во втором случае? – anand

ответ

0

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

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

Вместо этого, лучший способ создает функцию только один раз перед циклом, и ссылаться на него внутри:

var that = this; 
function clickHandler(event) { 
    that.doClick(event, this); 
} 
for(var i=0; i<x; ++i){ 
    var events = {click: clickHandler}; 
} 

Однако, поскольку events, кажется, не зависит от i, вы можете переместить его снаружи:

var that = this, 
    events = {click: function(event){ 
     that.doClick(event, this); 
    }}; 
for(var i=0; i<x; ++i){ 
    /* Use `events` here */ 
} 
+0

Теперь получите еще одно предупреждение jshint о том, что.doClick (event, this); «Возможная строгая voilation» – anand

+0

@ Alien01 jshint не знает, что вы будете использовать эту функцию только как метод, поэтому он предупреждает, что значение 'this' будет глобальным объектом в нестрочном режиме и не определено в строгом режиме. Вы можете добавить '/ * jshint validthis: true * /' inside' clickHandler', чтобы игнорировать это предупреждение или называть его 'ClickHandler', чтобы заставить jshint считать, что это конструктор. Кроме того, используйте мой второй код. – Oriol

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