更新以解决评论:
可能是我的问题不够清楚。让我换个说法。如果 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 如此出色!