2013-07-24 2 views
6

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

function updateQty() { 
     obj.find('.inputAmount').html(qty); 
     input.val(qty); 

     $.each(change_actions, function() { 
      this(qty); 
     }); 
    } 

Что именно происходит внутри функции .each? Я никогда раньше не видел this(var).

+9

change_actions должен быть массивом функций. в plain js, он работает как: function apply (v) {return this (v);} [1,2,3] .map (apply, RegExp); – dandavis

+0

Добавьте 'console.log (this)' или 'console.dir (this)' в тело обратного вызова и посмотрите, что означает 'this'. – fardjad

+0

Функция $ .each() может использоваться для итерации по любой коллекции, будь то объект или массив. В случае массива обратный вызов каждый раз передается индексом массива и соответствующим значением массива. (Доступ к этому значению также можно получить через это ключевое слово ...) отсюда: http://api.jquery.com/jQuery.each/ – svillamayor

ответ

3

установка автора свои собственные события с креплениями, поэтому вероятность change_actions являются функциями, которые подписался работать, когда что-то случается количество.

попробовать что-то вроде этого:

// initialize with a value 
var actions = [ 
    function(x){ console.log('I see a new x: ' + x); } 
]; 

// add actions "later" 
actions.push(function(x){ console.log('Yup, a new x: ' + x); }); 

// Then execute them: 
$.each(actions, function(){ 
    this(4); 
}); 

// add another one still 
actions.push(function(x){ console.log(x + ' looks new'); }); 

// re-iterate over them 
// Then execute them: 
$.each(actions, function(){ 
    this(5); 
}); 

и результат:

// first iteration (only 2 subscribed events) 
[15:56:50.030] "I see a new x: 4" 
[15:56:50.030] "Yup, a new x: 4" 

// second iteration (now we have 3, one was added later) 
[15:56:50.030] "I see a new x: 5" 
[15:56:50.030] "Yup, a new x: 5" 
[15:56:50.030] "5 looks new" // <-- new subscription 

думать о нем, как click события и как вы можете добавить подписки путем связывания с $('element').click(). каждый раз, когда происходит щелчок, все подписанные события активируются.

5

this внутри $.each относится к текущим объектам, которые вы просматриваете.

Объект должен быть функцией, чтобы передать что-то к ней.

3

Вы можете относиться к следующему примеру:

var change_actions = [ 
    function(x) { alert(x + 1); }, 
    function(x) { alert(x + 2); } 
]; 

var qty = 5; 
$.each(change_actions, function() { 
    this(qty); 
}); 

JSFiddle: http://jsfiddle.net/fuyz2/