为什么我的闭包功能不起作用?

时间:2017-01-23 06:14:54

标签: javascript closures

下面的函数在1个paranthesis罚款中添加参数。例如,它会计算addTogether(2,3) = 5addTogether(2,"3") = undefined

但是,它无法计算addTogether(2)(3) = 5,而是给我一个" addTogether(...)不是函数" 的错误。封闭函数(return function(x))应该进入addTogether(2)(3)中的第二个参数,并且我为什么不能正常工作而丢失。



function addTogether() {

  if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number") {
    return undefined;
  } //not harmful but not necessary
  var sum = 0;
  var num = arguments[0];

  if (arguments.length === 1) {
    //if only 1 argument in the original function...
    if (typeof arguments[0] !== "number") {
      return undefined;
      //returns undefined if arguments[0] isnt a number
    }

    return function(x) {
      if (typeof arguments[0] !== "number") {
        return undefined;
        //in the closure/2nd function, if first argument isnt a number then no sum will be provided
      } else {
        sum = num + x; //x = second given argument
        return sum;
      }
    };

  }

  if (typeof arguments[0] === "number" && typeof arguments[1] === "number") {

    for (var x = 0; x < arguments.length; x++) {
      if (typeof arguments[x] === "number") {
        sum += arguments[x];
        //add the argument[0] and [1] if both are number types, not string or array types or any other types
      } else {
        sum = undefined;
      }
    }

    return sum;

  }
  // the above "if" statement is rsponsible for achieving addTogether(2,3) = 5;

}

console.log(addTogether(2)(3));
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

如果您希望您的功能像addTogether(2)(3)一样工作,这意味着您的功能 addTogether必须接受一个参数并返回一个函数。 addTogether(2)此调用将返回一个新函数,然后使用第二个参数调用返回的函数。

在你比较的情况下

if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number") 

并使用一个参数调用该函数,第二个typeof arguments[1] !== "number"返回true,因为第二个参数是undefined,因此它不是数字而且函数返回{{1 }}

在您的代码中,您也可以删除一些条件。因为上述条件已经检查过了。

&#13;
&#13;
undefined
&#13;
&#13;
&#13;

答案 1 :(得分:1)

if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number")已导致addTogether(2)返回undefined

if语句放在函数末尾或将||转换为&&修复它。