设计一个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;
}
复制代码
以上两种实现方式,涉及的知识点基本同样,欢迎读者留言其余实现方式。
扫一扫 关注个人公众号【前端名狮】,更多精彩内容陪伴你!