有人可以解释一下这段代码吗?此示例来自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
答案 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}}将字符串作为参数)。
对于其余的代码,它只是递归地调用自己来计算参数的总和。