2014-11-11 3 views
0

Я создаю веб-скребок NodeJS, который должен перебирать данные в строке таблицы. Я обнаружил, что следующие два фрагмента кода каким-то образом демонстрируют одинаковое поведение. В первом сценарии, как увеличивается i?Автоматические приращения аргументов функции JavaScript

Я искал автоинкрементные переменные или аргументы в JavaScript и ничего не нашел.

Если это имеет значение, этот код находится внутри обратного вызова запроса, и я использую cheerio для анализа html.

Сниппет 1

$(this).find('td span').each(function(i) { 
    console.log(i); 
}); 

Сниппет 2

$(this).find('td span').each(function(i) { 
    console.log(i); 
    i++; 
}); 
+0

Если это DOM (с помощью JQuery или эквивалент), то это не относится к Node.js. – Sukima

+0

Он сказал, что использует cheerio, который является узловым модулем. –

+0

@ Сукима, вы правы - удалил тег 'node.js'. – Chris

ответ

2

Как the documentation for .each указывает, аргумент функции является индексом. Таким образом, jQuery каждый раз вызывает вашу функцию с соответствующим индексом - и jQuery - это тот, который отслеживает индекс.

Во втором примере, когда вы делаете i++, он фактически не влияет на исходный счетчик jQuery, который отслеживает jQuery, поскольку он просто снова передается вашей функции, когда следующий элемент переименован.

Вообще, если у вас есть функция вызывается с примитивным типом данных аргумента (например, числа, строки и т.д.)

function f(x) { 
    // change x here 
} 

Это не будет иметь влияние на x после этого конкретного вызова функции вернулся. Итак:

function f(x) { 
    x ++; 
    console.log(x); 
} 
var num = 1; 
f(num); // the function will log 2 
console.log(num); // num is still 1, though 

Когда так называемые «примитивы» (числа, строки, ...) передаются в функцию, только значениеэто передается, поэтому функция в основном имеем дело с копия.

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

+0

Спасибо! Я приму это, как только это позволит. – Corbin

+0

P.S., @CambridgeMike, я пошел и отредактировал ответ с некоторыми перефразированными/примерами. Надеюсь, ты не против! Отличное время отклика, кстати. – Chris

+1

ха-ха - спасибо @ Крис, очень ценим! – CambridgeMike

-2
$(this).find('td span').each(function(i) { 
    this.ctr = this.ctr || 0; // initialize ctr 
    this.ctr++; 
    console.log(ctr); // 1, 2, 3, 4,....... 
}); 
+0

Прошу прощения. Я все еще не понимаю, как это увеличивает «i». Являются ли аргументы в JS-функциях в '.each()' автоматически счетчиками? – Corbin

+0

'this.ctr = this.ctr || 0; 'ничего не делает ... –

+0

этот оператор инициализирует this.ctr со значением 0. Если this.ctr уже существует, он сохраняет свое значение в противном случае, он установлен в 0. – takinola

0

Если вы проверяете документацию jQuery, это должно стать ясным (я знаю, вы сказали, что используете cheerio, но они работают одинаково).

Для метода .each вы передаете функцию обратного вызова. Эта функция вызывается для каждого элемента в вашей коллекции jQuery (или cheerio, whatever), и индекс каждого элемента передается в качестве первого аргумента функции обратного вызова.

Итак, чтобы ответить на ваш вопрос, cheerio увеличивает эту переменную в соответствии с индексом текущего элемента, который он итерирует.

-1

Возможно, какой-то код может помочь:

var values = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; 
 

 
$.each(values, function(index, value) { 
 
    console.log('My value is "' + value + '" and index is ' + index + '.'); 
 
}); 
 

 
// Is mostly equivalent to: 
 

 
function myEach(array, callback) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    callback(i, array[i]); 
 
    }; 
 
} 
 

 
myEach(values, function(index, value) { 
 
    console.log('My value is "' + value + '" and index is ' + index + '!'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

код без полезного комментария или объяснения обычно не одобряется здесь – Alnitak

+0

Да, фигурировал @CambridgeMike лучше ответил, когда я редактировал этот, поэтому я сдался. Наверное, не сделал этого. – Sukima

+0

вы всегда можете удалить его, если вас не устраивает ответ. – Alnitak