我是函数式编程的新手,并试图通过对一些关键的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
对象有关,但我真的很想了解幕后发生的事情。
谢谢!
答案 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
})