1

我一直在 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如何知道如何解释nameindex?换句话说; 回调如何知道数组有值和索引?很明显,你给回调函数的输入变量起的名字并不重要,但顺序很重要,那么事情是如何映射的呢?

从这里我也想将这些知识应用于一般的其他对象,而不仅仅是列表。那么变量是如何从对象映射到回调函数的呢?这是在对象中预先定义的东西吗?

4

3 回答 3

3

在本机支持的浏览器中,Array.prototype.forEach它可能以不同的方式实现,但通常您会在遍历您的集合时以正确的顺序(无论可能是什么)Function.prototype.call执行带有参数的函数。callback

MDN 条目具有以下代码,用于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好用);在执行之前,它对数组一无所知。您正在调用的数组知道它具有索引,并且这些索引具有值,并且它还期望回调函数以特定顺序接受参数。数组和回调函数之间并不完全映射,该函数只是将每个索引及其对应的值依次传递给回调函数。indexvalueforEachforEach

于 2013-11-08T11:21:57.997 回答
2

该函数需要三个参数。他们叫什么并不重要。它将为您将正确的值传递给函数。

forEach为数组的每个元素执行callback一次提供的赋值。对于已删除或已初始化为 的索引,不会调用它undefined

callback使用三个参数调用:

  • 元素值
  • 元素索引
  • 被遍历的数组

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

于 2013-11-08T11:22:09.243 回答
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]-当前元素,i-索引,this-整个数组)。

有关如何调用不同的函数的更多信息,someFunction(arguments)请查看以下链接:

1.function.prototype.bind _

2. Function.prototype.call

3.function.prototype.apply _

于 2013-11-08T11:23:54.840 回答