我总是在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
和index
?换一种说法;回调如何知道数组有值和索引?很明显,你给回调函数的输入变量的名称并不重要,但顺序是,所以如何映射事物?
从这里开始,我还想将这些知识应用到其他对象中,而不仅仅是列表。那么变量如何从对象映射到回调函数?这是事先在对象中定义的东西吗?
答案 0 :(得分:3)
在本机支持Array.prototype.forEach
的浏览器中,它可能以不同的方式实现,但通常您会使用Function.prototype.call
以正确的顺序执行带有参数的callback
函数(无论如何)可能是)在迭代你的收藏品时。
forEach
的{{3}}具有以下代码,用于在不支持它的浏览器中为数组实现它:
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
和b
与index
和{{1}一样有效}});在它执行之前它对阵列一无所知。您正在调用value
的数组知道它具有索引,并且这些索引具有值,并且它还期望回调函数以特定顺序接受参数。事物并没有在数组和回调函数之间精确映射,forEach
函数只是依次将每个索引及其对应的值传递给回调函数。
答案 1 :(得分:2)
该函数需要三个参数。它们的名称并不重要。它会将正确的值传递给函数。
使用三个参数:调用
forEach
为具有指定值的数组的每个元素执行一次提供的callback
。对于已删除或已初始化为undefined
的索引,不会调用它。
callback
- 元素值
- 元素索引
- 正在遍历的数组
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
答案 2 :(得分:1)
为了更容易理解该特定方法,让我们看一下Array.prototype.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);
}
}
};
}
仔细看看fn.call
:这一行调用传递的回调函数,传递上下文(scope
)和参数(this[i]
- 当前元素,{{1} - 索引i
- 整个数组。)
有关如何调用与this
不同的函数的更多信息,请查看以下链接: