有人能解释一下,当传递更多的参数时,这个函数是如何报警的吗?我不能清楚地理解它。
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
发布于 2013-08-15 19:56:59
第一次调用函数时,第一个值存储在sum
中。在此之后,将返回function f(b)
,并在sum
中维护临时结果。对于每个连续的调用,您执行函数f
-您执行sum += b
并再次返回f。如果需要字符串上下文(例如在alert
或console.log
中),则调用f.toString
,返回结果(sum
)。
function sum(a) {
var sum = a
function f(b) {
sum += b
return f //<- from second call, f is returned each time
// so you can chain those calls indefinitely
// function sum basically got "overridden" by f
}
f.toString = function() { return sum }
return f //<- after first call, f is returned
}
解释:
alert( sum(6)(-1)(-2)(-3) ) // 0
/\ function sum called, f returned
/\ the returned function f is called, f returns itself
/\ again
/\ and again
/\ at last, alert() requires string context,
so f.toString is getting invoked now instead of f
发布于 2013-08-15 19:55:02
需要查看的是这段代码
function f(b) {
sum += b
return f
}
此函数返回对自身的引用,因此可以尽可能多次地调用它。关于它的一个重要的事情是它有一个可以被调用的tostring函数,因为tostring是在函数sum()
中定义的,所以它可以访问变量sum
和它的值current value (由f()
更改)
发布于 2013-08-15 19:52:52
alert
需要一个字符串。如果它没有获得字符串,它将尝试将它接收到的任何对象(而函数是一种对象)转换为字符串。如果对象具有toString
方法,则将调用该方法来执行上述转换。
https://stackoverflow.com/questions/18252084
复制相似问题