我一直在javascript中使用回调函数,但我从来不明白回调如何知道它可以接受哪些变量。
让我们看下面的示例代码;
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (name, index){
console.log(index + 1 + ". " + name);
});
这逻辑上输出;
1. Mike
2. Stacy
3. Andy
4. Rick
事实上,以下所有内容都会输出相同的内容;
friends.forEach(function (index, name){
console.log(name + 1 + ". " + index);
});
friends.forEach(function (foo, bar){
console.log(bar + 1 + ". " + foo);
});
friends.forEach(function (x, y){
console.log(y + 1 + ". " + x);
});
里面的回调函数是如何实现的forEach
知道如何解释name
and index
?换句话说;回调如何知道数组有值和索引?很明显,您为回调函数的输入变量指定的名称并不重要,但顺序很重要,那么如何映射呢?
从这里开始,我还想将这些知识应用到其他一般对象,而不仅仅是列表。那么变量是如何从对象映射到回调函数的呢?这是对象中预先定义的东西吗?
在支持的浏览器中Array.prototype.forEach本身它的实现方式可能有所不同,但通常您会使用Function.prototype.call执行callback
函数在迭代集合时以正确的顺序(无论是什么)提供参数。
The MDN条目 for forEach
有以下代码用于在不支持它的浏览器中实现数组:
if (!Array.prototype.forEach) {
Array.prototype.forEach = function (fn, scope) {
'use strict';
var i, len;
for (i = 0, len = this.length; i < len; ++i) {
if (i in this) {
fn.call(scope, this[i], i, this);
}
}
};
}
换句话说;回调如何知道数组有值和索引?很明显,您为回调函数的输入变量指定的名称并不重要,但顺序很重要,那么如何映射呢?
详细来说,回调函数只是一个像其他函数一样的函数,其参数可以任意命名(a
and b
效果一样好index
and value
);在执行之前它不知道有关数组的任何信息。您调用的数组forEach
on 知道它有索引,并且这些索引有值,并且它还期望回调函数以特定顺序接受参数。数组和回调函数之间的映射并不完全一致,forEach
函数只是依次将每个索引及其对应的值传递给回调函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)