FreeCodeCamp筆記之:Arguments Optional

题目

创建一个计算两个参数之和的 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

思路

  1. 解题:如果这个对象有2个参数,且两个参数都是数值,则两个参数相加;
  2. 任意一个参数不是数值,就返回 undefined;
  3. 如果只有一个参数,则返回一个函数,这个函数,这个函数被调用时,返回求和的结果( 这一段话理解了N久,什么鬼);
  4. 题目提示 Closures,Arguments object 两个函数;其中 Arguments object 比较好理解,因为需要将函数的2个参数转为数组,来进行计算;但 Closures 这个实在是太抽象了;
  5. 百度了好多,理解下来,闭包有这种特性:

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。
闭包的特性:

  • 函数内再嵌套函数
  • 内部函数可以引用外层的参数和变量
  • 参数和变量不会被垃圾回收机制回收
  1. 其实还是不是很明白,看来要多加练习

解答

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() ;
  • 程序写完能够执行,并返回正确结果;但闭包这个概念还是不是很懂;

你可能感兴趣的:(FreeCodeCamp筆記之:Arguments Optional)