設計一個sum
函數,使其知足如下要求前端
sum(1, 2).sumOf() // 返回 3面試
sum(1, 2)(3).sumOf() // 返回 6編程
sum(1)(2, 3, 4).sumOf() // 返回 10數組
sum(1, 2)(3, 4)(5).sumOf() // 返回 15bash
這道題目主要考察如下兩點:閉包
arguments
的應用;argumentsapp
arguments
對象是函數(非箭頭)內部均可以訪問到的局部變量,該對象是一個類數組對象,具備數組的length,索引特性。函數式編程
function print () {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
console.log(arguments.length); // 3
}
print(1, 2, 3);
// 利用arguments的索引特性,call、apply函數,可使用數組的方法
Array.prototype.shift.call(arguments);
// 將arguments轉爲數組,Array參數爲一個,而且是整數時,表示數組長度,超過一個時表示數組元素
var args = arguments.length == 1 ? [arguments[0]] : Array.apply(null, arguments);
複製代碼
鏈式編碼原理函數
鏈式調用原理就是做用域鏈,實現須要作以下的工做:ui
示例:
function add (num) {
var count = num;
var _b = function(l){
count += l;
return _b
}
_b.valueOf = function(){
return count
}
return _b
}
var c = add(1)(2)(3);
console.log(c) //6
複製代碼
下面咱們來詳細分析一下代碼:
綜上,咱們的面試題目,就能夠作以下實現:
function sum () {
var ary = [].slice.apply(arguments);
var fn = function () {
ary = ary.concat([].slice.apply(arguments));
return fn;
}
fn.sumOf = function () {
return ary.reduce((pre, cur) => {
return pre + cur;
})
}
return fn;
}
複製代碼
ary
存儲函數鏈式調用期間的全部參數;sumOf
,用於計算數組ary
的參數和;下面是我實現的另外一種方式,但須要設置一個函數靜態變量值存儲數據:
function sum() {
let s = 0;
for(let i = 0; i < arguments.length; i++) {
s += arguments[i];
}
sum.result += s;
return sum;
}
sum.result = 0;
sum.sumOf = function () {
let temp = sum.result;
sum.result = 0;
return temp;
}
複製代碼
以上兩種實現方式,涉及的知識點基本同樣,歡迎讀者留言其餘實現方式。
掃一掃 關注個人公衆號【前端名獅】,更多精彩內容陪伴你!