繁星淼淼
2018-08-02 09:10:18
寫一個函數(shù) add=function(n){} 求詳細(xì)代碼注釋解釋實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用相加效果 add(1)(2)(3)(4) //10 或者 addTwo + 5 // 7
1 回答

阿晨1998
TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個贊
順手寫了一個:
function add(n) { var fn = function(m) { return add(n + m); }; fn.valueOf = function() { return n; }; fn.toString = function() { return '' + n; }; return fn; }
測試:
+add(1) // 結(jié)果 1+add(1)(2) // 結(jié)果 3+add(1)(2)(3) // 結(jié)果 6+add(1)(2)(3)(4) // 結(jié)果 10'' + add(1)(2)(3)(4) // 結(jié)果 "10"
解釋:
因?yàn)槭擎準(zhǔn)秸{(diào)用,所以返回值肯定是一個函數(shù),這個函數(shù)我們記為
fn
。這個
fn
就是下一次調(diào)用的函數(shù),當(dāng)然它還是會返回一個函數(shù),顯然這個函數(shù)跟fn
的結(jié)構(gòu)是完全一樣的。但是如果這樣一直寫下去,你要寫無數(shù)次。所以呢,直接返回add就可以了,有點(diǎn)類似遞歸。而且,第二次調(diào)用add時需要把之前的結(jié)果累加進(jìn)去,所以是
add(m + n)
,“加法”就是在這一步實(shí)現(xiàn)的。既然每次都返回一個函數(shù),那么怎樣把計(jì)算結(jié)果取出來呢?我們把返回值函數(shù)的
toString
和valueOf
方法重寫了,讓它們返回和。這是因?yàn)閷ο?函數(shù)也是一種對象)在轉(zhuǎn)為原始類型時,會調(diào)用自身的toString
和(或)valueOf
方法。這樣以來,就可以把結(jié)果用在表達(dá)式中了,例如:
add(1) + add(2)(3) // 結(jié)果6add(3)(4) * add(5)(6) // 結(jié)果77
添加回答
舉報(bào)
0/150
提交
取消