0

我理解以下代码:

function subtract(p1, p2) { return p1 - p2; }
function calculate(p1, p2, calculator) { return calculator(p1, p2); }
var result = calculate(2, 3, subtract); //-1

但我不明白以下关于如何将 p1 和 p2 识别为 2 和 3 的代码:

var result = calculate(2, 3, function (p1, p2) { return p1 - p2; }); //-1
4

4 回答 4

2

更新以解决评论:

可能是我的问题不够清楚。让我换个说法。如果 Calculate 有 5 个参数: function calculate(p1, p2, p3, p4,calculator) { return calculator(p1, p2); 是否可以这样调用: var result = calculate(2, 3, 9, 5, function (p4, p3) { return p3 - p4; }); //4 不是-1 我的实际问题是:其中一个参数如何使用其他参数作为它的参数并区分哪个参数应该成为哪个参数?

匿名函数知道使用 p1 和 p2 参数的原因是因为计算函数定义中的参数是作为计算体中的参数传递给匿名函数的参数。

也许更清楚地理解这里发生的事情的方法是更改​​匿名函数的函数定义中的参数名称,以便在匿名函数的函数定义中不使用相同的参数名称。这会造成很多混乱,并且通常在计算机科学教科书中教授编程语言和抽象原理时故意这样做。

除了更改匿名函数中的参数名称外,将计算参数“calculator”更改为参数名称“fn”也可能有助于避免计算和计算器之间的混淆。考虑你的功能:

功能定义:

function calculate(p1, p2, p3, p4, fn) {

    // here you can see that calculate's p1 and p2 arguments (above) are bound
     // to whatever function we pass into the fn parameter.
      // Whatever values p1 and p2 represent are passed into the function "fn"
       // and are assigned to the parameters p1 and p2 of fn.
    return fn(p1, p2); 
}

函数调用计算,带有匿名函数:

我们如何知道前 4 个参数中的哪一个被传递到匿名函数中,哪些参数没有被使用?

// so here, we pass in an anonymous function that takes 2 parameters, one 
 //and two. We know from the definition above that whatever values are
  // passed in as calculate's p1 and p2 parameters are passed into fn, 
   //so one and two are assigned the values 2 and 3 respectively,
    // since p1 and p2 were assigned 2 and 3, and p1 and p2 were passed into
     // fn in calculate's function definition above.
calculate(2, 3, 9, 5, function(one, two) {
    return two - one;
});


// We know the values assigned to p1 and p2 are passed into the fn function
 // as the parameters of the anonymous function known as one and two.      
var result = calculate(2, 3, 9, 5, function(2, 3) {
    return 3 - 2;
}

请参阅return fn(p1, p2);此答案顶部的计算函数定义,以提醒为什么将分配给 p1 和 p2 的值传递给匿名函数。

因此,匿名函数返回 3 - 2 = 1。

有关此概念如何创建抽象的进一步阅读,请参阅Joel Spolsky 的文章 - 您的编程语言可以做到这一点吗?Joel 很好地解释了为什么 JavaScript 如此出色!

于 2012-05-10T06:31:12.870 回答
0

好吧,它是从引用名称function调用的,它看起来让您感到困惑,因为计算中的 arg 名称和计算器中的arg 名称是相同的。calculatecalculator

var result = calculate(2, 3, function (p1, p2) { return p1 - p2; }); //-1

现在计算函数,

function calculate(p1, p2, calculator) { return calculator(p1, p2); }

参数如下,

p1- 2
p2- 3
calculator - function (p1, p2) { return p1-p2; }
于 2012-05-10T06:27:06.447 回答
0

计算将它的第三个参数 (calculator) 调用为具有自己的前两个参数 p1 和 p2 的函数。

                   //parameters                            // passing trough as arguments
function calculate(p1, p2, calculator) { return calculator(p1, p2); }

Calculator 可以通过它自己的 p1 和 p2 版本从计算中访问 p1 和 p2,这可能看起来令人困惑,因为参数恰好具有相同的名称,但它们只是通过 trough 传递。

在您的示例中,您传递了一个本地函数来计算,然后将使用计算中的前 2 个参数调用该函数。

于 2012-05-10T06:28:13.530 回答
0

第三个参数是一个(匿名)函数表达式。该表达式的结果是对新创建的可调用对象(Function实例)的引用。

calculate函数被传递2,3和该对象引用作为参数。的第一个和第二个参数calculate分别命名为p1p2。第三个参数名为calculator。因此,在 中calculatep1用 初始化,用2初始化p23calculator用对先前创建的Function实例的引用进行初始化。

calculate然后调用被引用的Function实例,传递其p1p2参数的当前值,2以及3,作为第一个和第二个参数。

被调用的匿名函数有自己的第一个和第二个参数p1p2然后它们假定调用中的参数为它们传递的值,23。引用参数的表达式被求值并将结果返回给它的调用者,即calculate.

calculate然后将该值返回给它的调用者。

这种方法称为回调

下次,请先使用调试器。

于 2012-05-10T06:56:11.580 回答