Javascript嵌套函数与toString

时间:2012-10-27 22:59:45

标签: javascript

有人可以解释一下这段代码吗?此示例来自javascript.info。

我不明白,特别是f.toString = function(){ return sum}部分。

function sum(a) {

   var sum = a 

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

   f.toString = function() { return sum }

   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

4 个答案:

答案 0 :(得分:0)

javascript中的所有对象'继承'一个名为toString的字段,存在于boject的原型中。赋值toString与f上的任何其他字段一样存在。它被指定为一个函数,可以这样调用:

答案 1 :(得分:0)

基本上,sum是一个可以链接到多个调用的函数。 toString是一个对象的方法,如果在需要字符串的上下文中使用该对象,则返回应该显示的内容。

就个人而言,我认为这样更容易:

function sum() {
    var l = arguments.length, i, a = 0;
    for( i=0; i<l; i++) a += arguments[i];
    return a;
}
alert(sum(1,2));
alert(sum(5,-1,2));
alert(sum(6,-1,-2,-3));
alert(sum(0,1,2,3,4,5));

答案 2 :(得分:0)

我认为该片段的作者希望实现一个目标,即“假装”运算符重载,这在其他语言中是可能的。

由于sum会返回函数引用,我们无法像

那样
sum(5) + 5;

这会导致像"function sum() { ... }5"这样奇怪的东西。这是因为ECMAscript在 Math 操作中调用时会调用对象上的.toString()方法。但是,由于他覆盖了返回.toString() sum的{​​{1}}方法(这是一个数字),它会再次起作用。

答案 3 :(得分:0)

以下是MDN article about Function.toString

的摘录
  

Function对象覆盖从中继承的toString方法   宾语;它不会继承Object.prototype.toString。对于功能   对象,toString方法返回一个字符串表示形式   对象以函数声明的形式。也就是toString   反编译该函数,返回的字符串包括该函数   关键字,参数列表,花括号和源代码   功能体。

     当要将Function表示为文本值时,JavaScript会自动调用toString方法,例如,当一个函数是   与字符串连接。

基本上,这个“讨厌”的代码片段正在做的是为Function.toString提供一个实现,当需要字符串表示时,即在调用 alert 时使用它({ {3}}将字符串作为参数)。

对于其余的代码,它只是递归地调用自己来计算参数的总和。