JavaScript函数参数自动递增

时间:2014-11-11 23:23:31

标签: javascript function

我正在构建一个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++;
});

4 个答案:

答案 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;
&#13;
&#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,....... 
});