【问题标题】:How is passing an anonymous function as an argument internally used?如何将匿名函数作为内部使用的参数传递?
【发布时间】:2014-06-17 21:49:08
【问题描述】:

我遇到了一些我无法完全理解的代码。原则似乎很清楚,但我对在 forEach 函数调用中声明的第二个参数有一些困难。显然匿名函数是通过 action 参数传递给 forEach 的,但是在 for 循环中它究竟是如何工作的呢?

function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
    action(array[i]);
}

var numbers = [1, 2, 3, 4, 5], sum = 0;

forEach(numbers, function(number) {
  sum += number;
});

console.log(sum); // 15

我认为最让我困惑的是匿名函数的语法似乎与action(array[i]) 不兼容 - 我的意思是,我知道sum 获取数组的每个值转,但如果函数“替换”action 参数,(array[i]) 部分如何以及在哪里适合?

【问题讨论】:

  • 我对你的困惑感到困惑。 forEach 函数接受两个参数,第二个参数需要是对函数的引用(任何函数 - 命名的、匿名的,等等)...你传递一个匿名函数。在forEach 函数内部,它声明了action 参数......并且由于它应该持有对函数的引用,并且您可以调用函数,因此您可以调用action。调用 action 调用您传递的任何第二个参数。它用一个参数(array[i])调用它,它可以用作你传递的函数中的number参数
  • @Ian - 谢谢。我知道我有不能很好地解释自己的危险,但你已经帮助澄清了一些事情。我把它看作是整个 anon 函数都保存在 action 变量中,而不是对它的引用。因此,(array[i]) 似乎会继承该函数,而不是充当其参数。

标签: javascript arguments


【解决方案1】:

让我以更明确的方式重写该代码:

function forEach(array, action) {   //1st parameter is an array, the 2nd is a function
  for (var i = 0; i < array.length; i++)
    action(array[i]); //The function is used, with each element of the array as parameter
}

var numbers = [1, 2, 3, 4, 5], sum = 0;

var myFunction= function (number) { //I declare a function which receives a number
  sum += number;                    //and adds it to sum.
}

forEach(numbers,myFunction); //I call the forEach function using the
                             // variables I previously created as parameters

console.log(sum);

【讨论】:

  • 这就是这么简单的解释。看到它这样写,立即突出了我误解中的错误。谢谢。
【解决方案2】:

在 javascript 中,当你定义一个你写的变量时:

var x = 0; // here you reserve an object

当你定义一个函数时,你也保留了一个对象。 Javascript 将函数作为对象处理,您可以将其分配给任何变量:

var x = function(number){ sum +=number; };
forEach (numbers, x(number) );

关于混淆的语法,匿名函数是在运行时动态声明的函数。它们被称为匿名函数,因为它们的名称与普通函数不同。 因此,要调用匿名函数,请遵循以下语法:

// call
function (param1, param2, ...){
// function body
}

如果你想再次调用它,你应该重复上面的代码或者声明一个函数而不调用它并将它保存在可以多次调用的变量中:

// declaration
var x = function(param1, param2, ...){
    // body
};
// call
x(p1,p2,....);

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 2019-11-23
    • 2011-05-11
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多