2009-11-21 19 views

回答

11

在这种情况下,你是假设功能(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的内部,我们创建了一个,它接受另一个参数。这个匿名函数是作为执行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的一个特性 - 可以将函数作为参数传递并作为其他函数的结果返回的语言。

+0

+1伟大的链接,关闭 – bguiz 2009-11-21 13:33:18

1

如果你的函数返回一个函数,你也可以调用它。

x = f(1)(2) 

等同于:

f2 = f(1) 
x = f2(2) 
1

括号表示函数的调用(你 “呼” 的话)。如果您有

<anything>() 

这意味着anything的值是一个可调用的值。想象一下以下功能:

function add(n1) { 
    return function add_second(n2) { 
     return n1+n2 
    } 
} 

然后,您可以调用它为add(1)(2)这将等于3.您可以自然地扩展这个就像你想要的。

+0

没有必要给一个名称函数返回,顺便说一句。 '返回函数(n2)'同样好,输入也少。 – 2009-11-22 06:40:31

+0

我知道。我觉得也许最好不要通过使用匿名函数来混淆手头的问题。 – Svend 2009-11-22 12:31:39

4

您必须返回一个函数的函数:

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; 
     } 
    } 
    }; 
} 
+1

对downvote好奇吗?如果你不解释你不喜欢的是什么,那是毫无意义的...... – Guffa 2009-11-21 18:36:42

相关问题