功能值及其执行方式(工作原理)?

时间:2015-02-26 20:28:38

标签: javascript

我正在阅读Eloquent JavaScript书籍,目前正在进行第5章(高阶函数)。到目前为止,我做得很好并清楚地理解了材料,但我已经意识到我不明白功能价值究竟是什么以及它们是如何运作的。我确实理解了什么是函数,并且非常熟悉使用function关键字创建它们的语法,就像在C中一样。

假设书中有以下代码:

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);

forEach函数在被调用时如何确定数字是多少?它是如何从数字数组中提取数字的。我确实理解forEach函数定义中的action参数&#34; hooks&#34;对for循环当前指向的元素的操作,但我将代码解释如下:

function(number) {sum += number;}action(array[i])

没有多大意义。

如果你能说明这个问题,我不仅要感恩,还要解释功能价值究竟是什么?它与功能和/或功能返回值有何不同?

谢谢。

3 个答案:

答案 0 :(得分:0)

  

我不明白功能值究竟是什么以及它们如何工作

一个函数(在JavaScript中)是一个可以调用的对象。一个函数调用没什么特别的,它只是一个表达式(比如一个变量求值),后跟一对带有参数的括号。

你可以写

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

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

并且它意味着basically相同:你有一个函数对象,一个引用它的变量addToSum,它被传递给forEach调用。

  

forEach函数在被调用时如何确定数字是多少?

它对numbers一无所知。所有forEach函数看到的是一个数组值(由参数名称array引用)和一个函数值(由参数名称action引用)。然后它遍历该数组,并使用每个元素调用action函数。仅在被调用函数内部,此数组元素称为number

  

我将代码解释如下:function(number) {sum += number;}action(array[i])没有多大意义。

如果将变量展开为其值,变量名称将消失:

(function(number) {sum += number;})(array[i]);

确实有意义 - 正如我上面所写,函数调用只是一个表达式,后跟括号。并且该表达式需要求值为一个可调用的对象,这个函数表达式就是这样做的。

您也可以将其重写为

function action(number) { sum += number; }
action(array[i]);

如果这对你更有意义。

答案 1 :(得分:0)

据我所知,我认为你被JavaScript callback function.

弄糊涂了

在javascript中,这样的函数:

看看你的代码:

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

forEach(numbers, function(number) {
  ...

对于数组的每个项目(第一个参数,通过array[i]访问),您使用该值action(array[i])调用操作。

forEach(numbers, function(number) {中,您已将动作(第二个参数)作为具有一个输入的函数传递。这是forEach使用每个数组元素调用的函数。随着forEach中for循环的每次传递,使用新值调用此函数。

我认为尝试使用其他示例(现在只需启动js控制台并开始搞乱)将帮助您学习这个概念。

如果我做了一个功能

function run(callback){
  callback();
}

并称之为:

run(function(){
  console.log('foo bar baz');
});

我希望看到"foo bar baz"打印到控制台。

如果我现在创建一个新功能,并调用它,

function withTheAnswer(callback){
    callback(42);
}

withTheAnswer(function(theAnswer){
  alert('The answer is ' + theAnswer);
});

我希望42会被警告。

老实说,当你开始学习更多有关JS的知识时,你会发现这很多,因此完全理解它。

答案 2 :(得分:0)

动作属性是一个功能。在你输入:'action([a number])'之前,这个函数不会被调用。然后在for循环中为array属性的每个元素调用具有相应数字的函数action。 正如@theonlygusti所说,这个函数叫做回调。