【发布时间】:2009-11-21 23:13:44
【问题描述】:
我了解调用函数(1)但不了解函数(1)(2),它是如何工作的?
function(1)(2)(3)(4) 也可以吗?
【问题讨论】:
标签: javascript function
我了解调用函数(1)但不了解函数(1)(2),它是如何工作的?
function(1)(2)(3)(4) 也可以吗?
【问题讨论】:
标签: javascript function
在这种情况下,您假设 function(1) 返回一个函数,而不是使用参数 2 调用这个新的匿名函数。
看这个例子:
function sum(a) {
return function(b) {
return a+b;
}
}
// Usage:
window.alert(sum(5)(3)); // shows 8
var add2 = sum(2);
window.alert(add2(5)); // shows 7
window.alert(typeof(add2)); // shows 'function'
这里我们创建了一个函数sum,它接受一个参数。在函数sum 中,我们创建了一个接受另一个参数的anonymous function。这个匿名函数作为执行sum的结果返回。
请注意,这个匿名函数是我们称之为 closure 的一个很好的例子。闭包是一个保留创建它的上下文的函数。在这种情况下,它会将变量a 的值保留在其中,就像示例函数add2 一样。如果我们创建许多闭包,它们是独立的,如您所见:
var add3 = sum(3);
var add4 = sum(4);
window.alert(add3(3)); // shows 6
window.alert(add4(3)); // shows 7
此外,如果您有类似命名的局部变量,它们就不会“混淆”:
var a = "Hello, world";
function multiply(a) {
return function(b) {
return a * b;
}
}
window.alert(multiply(6)(7)); // shows 42
var twoTimes = multiply(2);
window.alert(typeof(twoTimes));
window.alert(twoTimes(5));
因此,在调用sum(2) 或multiply(2) 之后,结果不是数字,也不是字符串,而是function。这是 functional languages 的一个特点——在这些语言中,函数可以作为参数传递并作为其他函数的结果返回。
【讨论】:
你有一个返回函数的函数:
function f(n) {
return function(x) {
return n + x;
};
}
当你调用 f(1) 时,你会得到一个对函数的引用。您可以将引用存储在变量中并调用它:
var fx = f(1);
var result = fx(2);
也可以直接调用:
var result = f(1)(2);
要得到一个返回函数的函数返回一个函数的函数,你只需要重复这个过程:
function f(n) {
return function(x) {
return function(y) {
return function(z) {
return n + x + y + z;
}
}
};
}
【讨论】:
如果你的函数返回一个函数,你也可以调用它。
x = f(1)(2)
相当于:
f2 = f(1)
x = f2(2)
【讨论】:
括号表示函数的调用(你“调用”它)。如果你有
<anything>()
表示anything的值是一个可调用值。想象一下以下函数:
function add(n1) {
return function add_second(n2) {
return n1+n2
}
}
然后,您可以将其调用为 add(1)(2),它等于 3。您自然可以随意扩展它。
【讨论】:
return function(n2) 也一样好,而且打字更少。