javascript - 为什么我的闭包函数不起作用?

标签 javascript closures

下面的函数可以在 1 个括号内添加参数。例如,它计算 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));

最佳答案

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

根据您的情况进行比较

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

并使用一个参数调用该函数,第二个 typeof argument[1] !== "number" 返回 true,因为第二个参数是 undefined,所以它不是一个数字,并且您的函数返回undefined

在您的代码中,您还可以删除一些条件。因为上面的条件已经检查了它们。

function addTogether() {

  if (typeof arguments[0] !== "number") { 
    return undefined;
  } 
  var sum = 0;
  var num = arguments[0];

  if (arguments.length === 1) {  

    return function(x) {
      if (typeof arguments[0] !== "number") {
        return undefined;
        
      } else {
        sum = num + x; 
        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];
        
      } else {
        sum = undefined;
      }
    }

    return sum;

  }
  
}

console.log(addTogether(2)(3));

关于javascript - 为什么我的闭包函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800249/

相关文章:

javascript - 在 IE 8 中,选择选项在鼠标悬停时消失

javascript - 获取列表项的值给我 0

javascript - 如何使用 jQuery(或 vanilla JS)在选项卡上创建新输入

go - 谁能解释一下 Go Tour 网站上的 compute(fn func()) 代码?

rust - 闭合体的生命周期与传递给它的值之间不匹配

javascript - 日期选择器对所有字段使用下拉菜单 JavaScript 和 JQuery W/O 日历

javascript - Redux 工具包存储在下一个 js 中的页面之间导航时自动重置

java - 来自不同脚本的闭包的 Groovy 全局存储

JavaScript 闭包 : Loop inside Loop

javascript - 如何在闭包中使用 'uncapture' 变量?