函數還能這樣玩兒~實現類似add(1)(2)(3)的函數


人生的第一份前端工作找到了,感謝大神主子們給半路出家自學的我這么多的機會,很高興正式踏上客觀又樂趣滿滿的程序員之路,哇咔咔咔。

​ 分享一個准備面試時遇到的一個有趣的問題:

要求實現類似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()函數就可以返回正確的數值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM