2015-08-29 56 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