人生的第一份前端工作找到了,感謝大神主子們給半路出家自學的我這麼多的機會,很高興正式踏上客觀又樂趣滿滿的程式員之路,哇咔咔咔。 分享一個準備面試時遇到的一個有趣的問題: 要求實現類似 調用方式的方法,例如add為加法函數,則調用 輸出3,調用 輸出9。 函數的調用方式是多次調用同一個函數,將 ...
人生的第一份前端工作找到了,感謝大神主子們給半路出家自學的我這麼多的機會,很高興正式踏上客觀又樂趣滿滿的程式員之路,哇咔咔咔。
分享一個準備面試時遇到的一個有趣的問題:
要求實現類似
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的值;
addMore.toString = function() {
return sum;
};
如上解決方法是改寫addMore閉包函數的toString方法,返回sum值。全部代碼如下:
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()函數就可以返回正確的數值。