JS, return 函数名

JS, return function name

我刚刚开始学习 javascript,遇到了一项我不理解的任务。任何人都可以解释为什么我们在这个例子中 return 函数名称 "return f" 以及我们使用 "f.toString" 的目的是什么?

function sum(a) {

  var currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15

您正在返回对象。因此,您可以再次调用该函数,在第二次调用中,您将拥有一个 currentSum。

当您执行 sum(3) 时,该函数将保存数字 3,当您再次调用它执行 sum(3)(4) 时,它将向 currentSum 添加 4。

然后警报将调用 toString 方法并打印总和

看第一个例子

alert( sum(1)(2) ); // 3
sum(1) // will return f. sum must return a function in order for the syntax to work

之后它将 return f 变为:

alert( f(2) );

这是理解 JavaScript 类型系统的任务。任务是制作使用 currying 添加数字的函数。这个想法是制作在像这样调用时添加数字的函数 sum(1)(2)(3),正如您在任务中所写的那样。

我们在函数 sum:

中做什么(查看您的代码)

1.

  var currentSum = a;

在这里你在函数范围内声明了一个总和变量sum

  1. 函数 f(b) { 当前总和 += b; return f; }

然后声明将执行求和的函数。它 return 本身就有可能做这样的事情:f(1)(2)(3)

3.

  f.toString = function() {
     return currentSum;
  };

声明f后,转换为字符串returns和值

  1. 比你return f 开始添加。

比 f.toString 怎么样 - 它被调用,当 f 作为参数传递 alert 时。这是 javascript

的自动转换

使用函数 sum 传递第一个参数 a 和 returning 函数 fcurrentSum 与传递给 [= 的参数相加12=] (b) 和 return 再次 f 你可以多次这样做,最后它会调用 alert 函数,它需要它的第一个参数是细绳。为此,您重写了函数 f toString 上的方法,在这种情况下,return 将 currentSum.

每个对象都有一个 toString() 方法,当对象要表示为文本值时会自动调用该方法。

让我们从简化版本开始:

function sum(currentSum) {       
   return function f(b) {
     currentSum += b;
     return f;
   }  
}

它会像你的一样工作,你可以这样做:

sum(1)(2)(3);//f
sum(1)(2);//f

但是,他们总是return一个函数,所以无法访问currentSum。它的总和 scope 并且由于它从未 returned 或通过,所以不可能得到它。所以我们可能需要另一个我们可以调用的函数来获取当前总和:

 function sum(currentSum) {
   function f(b) {
     currentSum += b;
     return f;
   }

  f.getSum = function() {
     return currentSum;
  };

  return f;
}

所以现在 f 有一个 属性 (函数也是对象),这是一个名为 getSum 的函数来获取我们的变量

sum(1)(2)(3)//f
sum(1)(2)(3).getSum()//6 <= wohhooo

但是为什么我们称它为 toString 呢?

将变量添加到字符串时,将其转换为字符串,例如

1+"one"//"1one"

同样适用于objects/functions,但在这种情况下,js解析器首先尝试调用它们的toString方法,因此:

sum(1)(2)+"three"

等于

sum(1)(2).toString()+"three"

将非字符串传递给警报时会发生相同的转换。