人生的第一份前端工做找到了,感謝大神主子們給半路出家自學的我這麼多的機會,很高興正式踏上客觀又樂趣滿滿的程序員之路,哇咔咔咔。前端
分享一個準備面試時遇到的一個有趣的問題:程序員
要求實現相似
add(1)(2)(3)
調用方式的方法,例如add爲加法函數,則調用add(1)(2)
輸出3,調用add(1)(5)(3)
輸出9。面試
函數的調用方式是屢次調用同一個函數,將每次傳入的參數累加,屢次函數運算過程當中須要記錄以前累加的值。很容易讓咱們聯想到閉包,若是調用次數是固定的,咱們能夠這樣來完成:瀏覽器
var add = function(a) { return function(b) { return function(c) { return a + b + c; }; }; }; add(1)(2)(3); //6
能夠看到運用閉包能夠依次獲取三次調用的參數,最終返回相加的結果。但若是要調用四次,這個函數就不適用了。如題目要求的不限次數調用,咱們是否是可讓閉包函數返回自身來實現呢?以下:閉包
var add = function(a) { var sum = a ; var addMore = function(b) { sum += b; return addMore; //addMore函數每次累加後返回自身,繼續累加後面的執行參數。 }; return addMore; //獲取第一個參數賦值給sum後,返回addMore函數。 }
理論上這樣就解決問題了,但在調試中咱們會發現,當函數調用完畢後,輸出的結果並非sum,而是addMore函數,由於咱們每次調用後都return函數自身。那如今須要解決的問題就是如何讓函數輸出sum值。函數
在網上搜索答案後發現解決方法是:調試
首先要知道JavaScript中,打印和相加計算,會分別調用toString或valueOf函數,因此咱們重寫tmp的toString和valueOf方法,返回sum的值;code
addMore.toString = function() { return sum; };
如上解決方法是改寫addMore閉包函數的toString方法,返回sum值。所有代碼以下:ip
var add = function(a) { var sum = a; var addMore = function(b) { sum += b; return addMore; }; addMore.toString = function() { return sum; }; return addMore; }; add(1)(2)(3)(4); //function 10 var a = add(1)(2)(3)(4).toString(); //10
如上代碼的倒數第二行,函數最終返回的值會包含一個function前綴(暫時沒有找到緣由,是瀏覽器給出的提示麼?請各位大神指導*0 *);結果再運用toString()函數就能夠返回正確的數值。io