2

谁能解释一下这段代码?此示例取自 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

4 回答 4

0

javascript 中的所有对象都“继承”一个名为的字段,该字段toString存在于 boject 的原型中。赋值后toString与 f 上的任何其他字段一样存在。它被分配为一个函数,并且可以这样调用:

于 2012-10-27T23:01:47.800 回答
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));
于 2012-10-27T23:03:27.103 回答
0

我认为该片段的作者想要实现一个目标,即类似“伪造”运算符重载之类的东西,这在其他语言中是可能的。

由于sum返回一个函数引用,我们不能像

sum(5) + 5;

这会导致一些奇怪的东西,比如"function sum() { ... }5". 这是因为 ECMAscript在数学.toString()运算中调用对象时会调用该方法。但是由于他覆盖了返回的方法(这是一个数字),它确实再次起作用。.toString()sum

于 2012-10-27T23:14:29.530 回答
0

这是MDN 文章中关于 Function.toString的片段

Function 对象覆盖了继承自 Object 的 toString 方法;它不继承 Object.prototype.toString。对于 Function 对象,toString 方法以函数声明的形式返回对象的字符串表示形式。即 toString 对函数进行反编译,返回的字符串包括函数关键字、参数列表、花括号和函数体的来源。

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

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

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

于 2012-10-27T23:54:13.473 回答