JS,返回函数名

时间:2017-07-18 07:43:31

标签: javascript return tostring

我刚开始学习javascript并遇到一项我不理解的任务。任何人都可以解释我为什么要返回功能名称"返回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

5 个答案:

答案 0 :(得分:1)

让我们从简化版开始:

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

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

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

但是,它们总是返回一个函数,因此无法访问 currentSum 。它总和范围并且由于它永远不会返回或通过,因此无法获得它。所以我们可能需要另一个函数来调用以获得当前的总和:

 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"

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

sum(1)(2)+"three"

等于

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

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

答案 1 :(得分:0)

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

当你总和(3)时,该函数将保持数字3,当你再次调用它时,执行sum(3)(4)它会将4添加到currentSum。

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

答案 2 :(得分:0)

看一下第一个例子

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

它将返回f后将变为:

alert( f(2) );

答案 3 :(得分:0)

这是理解JavaScript类型系统的任务。任务是使用currying创建添加数字的功能。当您在任务中编写时,我们的想法是创建在调用sum(1)(2)(3)时添加数字的函数。

我们在函数sum中做了什么(查看代码):

1

  var currentSum = a;

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

  1. function f(b){     currentSum + = b;     返回f;   }

  2. 然后声明将执行求和的函数。它返回自己做这种事情的可能性:f(1)(2)(3)

    3

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

    之后,您声明f,转换为字符串返回总和值

    1. 比你返回f开始添加。
    2. 与f.toString相比 - 当f被传递alert作为参数时,它被调用。这是javascript的自动转换

答案 4 :(得分:0)

使用函数sum,您传递第一个参数a并返回函数f,其中currentSum与传递给f的参数b并且再次返回f并且你可以在你想要的时候做很多次它会调用alert函数,它需要它的第一个参数是字符串。为此,您已在函数f toString上重写了该方法,在这种情况下将返回currentSum

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