我正在构建一个NodeJS Web scraper,它必须遍历表行中的数据。我发现以下两个代码片段以某种方式表现出相同的行为。在第一种情况下,i
如何增加?
我在JavaScript中搜索了自动递增变量或参数,到目前为止没有找到任何内容。
如果重要,这段代码在请求回调中,我使用cheerio来解析html。
Snippet 1
$(this).find('td span').each(function(i) {
console.log(i);
});
Snippet 2
$(this).find('td span').each(function(i) {
console.log(i);
i++;
});
答案 0 :(得分: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
当所谓的“primitives”(数字,字符串,...)传递给函数时,只传递值,所以函数是基本上处理副本。
当您传递一个对象时,正在传递一个引用到该对象,这意味着该函数正在处理相同的原始对象(因此可以修改它)。
答案 1 :(得分:0)
如果你检查jQuery文档,它应该变得清晰(我知道你说你正在使用cheerio,但它们的工作方式相同)。
对于.each
方法,您传入一个回调函数。为jQuery(或cheerio,无论)集合中的每个元素调用该函数,并将每个元素的索引作为回调函数的第一个参数传入。
所以,为了回答你的问题,cheerio正在递增该变量以匹配它迭代的当前元素的索引。
答案 2 :(得分:-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 + '!');
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 3 :(得分:-2)
$(this).find('td span').each(function(i) {
this.ctr = this.ctr || 0; // initialize ctr
this.ctr++;
console.log(ctr); // 1, 2, 3, 4,.......
});