2015-08-29 47 views
-1

时,我必须编写必须由类型错误:调用函数

sum(2,3); //5 
//or 
sum(2)(3); //5 

我写这篇文章的代码

function sum (a,b){ 
return a + b; 
} 
sum(2,3); 

我也得到调用一个函数数量不是一个函数'TypeError:数字不是函数'。为什么?

+1

*“我必须编写必须由调用一个函数” *为什么呢?另外:你不能(合理地)这样做。 –

+0

执行它作为'sum(2,3)'将* not *给你所描述的TypeError!猜你的意思是:'sum(2)(3)'。关于你的字面问题**为什么**:你当前的函数返回一个数字(数字a +数字b是一个数字..如果(其中一个)参数是一个字符串,那么你会得到一个字符串作为回报,这是。 .. *也*不是一个函数)。然后你试着执行'()'这个返回的数字(这不是一个函数),传递参数值'3'。但是由于这个数字不是一个函数,所以你得到的只是一个TypeError ...是的,我不能帮助自己,但是再次..你问了“为什么”的问题...... – GitaarLAB

回答

1

你可以这样做:

function sum(a,b) { 
    return arguments.length>1? a+b : function (b) { return a + b }; 
} 
+1

你最好检查'arguments .length'相等2.'sum(1,0)'将失败。 –

+0

现在通过使用arguments.length> 0修复了 – Hazem

-1

只能调用这个方法的功能。

sum(2,3); 
+1

为什么?功能可以返回另一个功能。 –

+0

但是在上面的问题中,他们没有返回函数。这就是我说的原因。 – Tabish

+2

我相信这就是为什么OP要求帮助:)他不能以他想要的方式调用他的功能。为什么?怎么修?你的回答只能说明他的代码不起作用。 –

1

你应该使用curried功能:

function sum(a, b) { 
    if (b === undefined) { 
    return function (b) { 
     return a + b; 
    } 
    } 
    return a + b; 
} 

// sum(1, 2) === sum(1)(2) 
+1

如果'b'为0会怎么样。 –

+0

@YuryTarabanko好点。更新。 – Vidul

+0

当前最佳答案。 Svend Tofte曾经在很久以前写过关于它的文章,克罗克福德和他复制了这篇文章,很好阅读:http://www.crockford.com/javascript/www_svendtofte_com/code/curried_javascript/index.html。编辑:*实际使用*:http://stackoverflow.com/questions/113780/javascript-curry-what-are-the-practical-applications。基本上,这只是使用*闭包*来实现这个概念。顺便说一句,也可以使用'new Function'。 – GitaarLAB