javascript回调函数,变量映射

时间:2013-11-08 11:16:41

标签: javascript callback

我总是在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?换一种说法;回调如何知道数组有值和索引?很明显,你给回调函数的输入变量的名称并不重要,但顺序是,所以如何映射事物?

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

3 个答案:

答案 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);
            }
        }
    };
}
  

换句话说;回调如何知道数组有值和索引?很明显,你给回调函数的输入变量的名称并不重要,但顺序是,所以如何映射事物?

详细说明,回调函数只是一个与其他函数一样的函数,其参数可以任意命名(abindex和{{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不同的函数的更多信息,请查看以下链接:

1。Function.prototype.bind

2。Function.prototype.call

3。Function.prototype.apply