题目
创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。例如,add(2, 3)应该返回5,而add(2)应该返回一个 function。调用这个有一个参数的返回的 function,返回求和的结果:var sumTwoAnd = add(2);sumTwoAnd(3)返回5。如果两个参数都不是有效的数字,则返回 undefined。如果你被卡住了,记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。
这是一些对你有帮助的资源:
Closures
Arguments object
思路
- 解题:如果这个对象有2个参数,且两个参数都是数值,则两个参数相加;
- 任意一个参数不是数值,就返回 undefined;
- 如果只有一个参数,则返回一个函数,这个函数,这个函数被调用时,返回求和的结果( 这一段话理解了N久,什么鬼);
- 题目提示 Closures,Arguments object 两个函数;其中 Arguments object 比较好理解,因为需要将函数的2个参数转为数组,来进行计算;但 Closures 这个实在是太抽象了;
- 百度了好多,理解下来,闭包有这种特性:
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。
闭包的特性:
- 函数内再嵌套函数
- 内部函数可以引用外层的参数和变量
- 参数和变量不会被垃圾回收机制回收
- 其实还是不是很明白,看来要多加练习
解答
function add() {
var arr = Array.prototype.slice.call(arguments); // 将参数转为数组
var val = arr.every(function(item) { //判断数组的每一个元素是否都是数字
return Number.isFinite(item);
});
if (!val){
return undefined; //如果不是数组,返回undefined
} else {
if (arr.length===2){ // 如果数组有2个元素,即函数有2个参数
return arr[0]+arr[1]; //将2个参数相加;
} else{
var arr2 = arr[0]; //否则取得第一个元素
return function(Two){ //定义一个新的函数(这里是否就是所谓的Closures??);
if (Number.isFinite(Two)){ //判断这个函数传入的参数是否为数字
return arr2 + Two ; //正常则将这个参数与上一个函数的唯一的参数相加;
} else{
return undefined; //如果这个新函数的参数不是数字,则返回undefined;
}
};
}
}
}
add(2,3);
- 写到判断是否数值的时候,又卡住了;百度之后发现需要使用 isFinite() ;
- 程序写完能够执行,并返回正确结果;但闭包这个概念还是不是很懂;