了解Underscore的_.each

时间:2014-05-08 03:17:17

标签: javascript function arguments call underscore.js

我是函数式编程的新手,并试图通过对一些关键的Underscore函数进行逆向工程来收集知识。由于_.each是基础的,我虽然从那里开始。这是我的简化(简单)版本,没有错误检查,上下文绑定和一堆其他Underscore非常棒:

var myEach = function(collection, iterator) {
    if (collection instanceof Array) {
      for (var i = 0; i < collection.length; i++) {
        iterator(collection[i], i, collection);
      }
    } else {
      for (var key in collection) {
        iterator(collection[key], key, collection);
      }
    }
  };

欢迎提出一般性意见,但我的问题特别围绕传递给(collection[i], i, collection)的{​​{1}}个参数。

这里发生了什么?这些参数在使用过程中如何成为可选参数?

非常确定它与iterator对象有关,但我真的很想了解幕后发生的事情。

谢谢!

1 个答案:

答案 0 :(得分:2)

在javascript中,函数的调用者决定传递它正在调用的函数的参数。

然后,被调用的函数可以决定使用或不使用哪些参数。因此,可以声明迭代器回调,但它想成为。第一个参数将是项目被迭代,第二个参数将是集合的索引,第三个参数将是集合本身。

如果仅使用第一个参数声明回调,那么这并不重要。无论回调是否声明它们,所有三个参数都存在,如果它们未在函数声明中声明,则它们不能通过命名参数访问,但它们都在arguments对象中。


也许这会给你一些想法:

function callMe(callback) {
    callback(1, 2, 3);
}

callme(function(a) {
    // a === 1
})

callme(function() {
    // all the arguments are still there
    // even though none are declared
    // arguments[0] === 1
    // arguments[1] === 2
    // arguments[2] === 3
});

callme(function(a, b, c) {
    // a === 1
    // b === 2
    // c === 3
})

callme(function(a, b, c, d) {
    // a === 1
    // b === 2
    // c === 3
    // d === undefined
})