【问题标题】:Arguments Optional - why do I get a string for arguments (2)([3])?参数 可选 - 为什么我得到参数 (2)([3]) 的字符串?
【发布时间】:2021-02-04 05:01:07
【问题描述】:

这是我对 Freecodecamp 中 Arguments Optional Challenge 的问题的跟进(见下文 0:

我现在已经满足了 5/6 的挑战条件,除了输入为 addTogether(2,([3])) 时,它返回 '23' 作为字符串而不是正确的 'undefined'。

如果 [3] 是一个数组,而一个数组是一个对象,我的 checkNum 函数不应该将其标记为未定义吗?字符串是在哪里生成的?

我现在的代码:

function addTogether() {
  function checkNum(x) {
    return typeof x === 'number' ? x : undefined;
  }

  let num1 = checkNum(arguments[0]);
  let num2 = checkNum(arguments[1]);

  if (arguments.length === 1) {
    if (typeof num1 === 'number') {
      let a = num1;
      return function (b) {
        return a + b;
      };
    }
    return undefined;
  }

  if (arguments.length > 1) {
    if (typeof num1 !== 'number' || typeof num2 !== 'number') {
      return undefined;
    }
    if (typeof num1 === 'number' && typeof num2 === 'number');
    {
      return arguments[0] + arguments[1];
    }
  }
}

谢谢

//下面的原始问题:

我卡在 freecodecamp 问题上 Arguments Optional。 https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional 在研究这个问题时,多次引用了以下代码块,但我就是不明白它的含义:

if(arguments.length==1){
      if (typeof a == "number"){
        return function(b){
          if (typeof b == "number"){
            return a + b;
          }
        };
      }
    }

我理解到'return function(b)'部分,然后我的大脑融化了。

如果有人可以向 6 岁的孩子解释一下,这个菜鸟将非常感谢您的帮助。

【问题讨论】:

  • 当封闭函数返回 function(b) 事物时,它返回的代码气泡记住它可以访问的变量,其中恰好包括 a。所以这个气泡会随身携带a,直到它调用函数本身。发生这种情况时,b 被传递到函数中。该函数只是从其内存中调用a并将其添加到b。整个想法都包含在一个闭包中(双关语)。如果你正在学习“中级 JavaScript”——你应该学习一下。 Reference.
  • 如果该代码让您大吃一惊,请查看此 Gist 中与您发布的代码完全相同的现代代码:gist.github.com/randycasburn/…
  • 哇,我只能理解现代代码中发生的事情的 20%。我还有很长的路要走……

标签: javascript function arguments


【解决方案1】:

返回一个函数而不是一个值是很常见的做法。

当用一个参数调用外部函数(应该做加法)时,它不是做加法(不能做)而是返回一个函数。随后使用数字参数调用该函数时,它会执行函数b 并求和。

假设外部函数名称为add(),则可以通过以下方式触发:

add(10, 15); // 25
var f = add(20);
f(18) // 38
add(4)(6) // 10

完整示例:

function add(a, b) {
    if (arguments.length == 1) {
        if (typeof a == "number") {
            return function (b) {
                if (typeof b == "number") {
                    return a + b;
                }
            };
        } else {
            return "undefined";
        }
    } else if (arguments.length == 2) {
        if (typeof a == "number" && typeof b == "number") {
            return a + b;
        } else {
            return "undefined";
        }
    } else {
        return "undefined";
    }
}

console.log(add(10, 15));
var f = add(20);
console.log(f(18));
console.log(add("xyz"));
console.log(add(10, "5"));
console.log(add(4)(6));

【讨论】:

  • 后续问题:据我所知,在这种情况下,带有参数 b 的返回函数不需要名称,也不需要分配给变量。对吗?
  • 没错。这是一个匿名函数。返回时,您可以选择分配给变量或直接以add(4)(6) 进行第二次调用
【解决方案2】:

我们可以通过两种方式声明函数,常规方式:

function test(){
}

或有趣的方式

let test = function(){

}

在这种情况下,函数返回一个函数 看这里:

function returnfunction(){
 return function(b){
          if (typeof b == "number"){
            return a + b;
          }
        }
}
let x = returnfunction()

所以,x是returnfunction的返回值,也就是

function(b){
          if (typeof b == "number"){
            return a + b;
          }
}

和上面的很像,

x = function(){
//...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 2017-06-10
    • 1970-01-01
    • 2019-03-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多