首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有多个括号的Javascript中的闭包

带有多个括号的Javascript中的闭包
EN

Stack Overflow用户
提问于 2013-08-15 19:50:31
回答 5查看 5.5K关注 0票数 18

有人能解释一下,当传递更多的参数时,这个函数是如何报警的吗?我不能清楚地理解它。

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-15 19:56:59

第一次调用函数时,第一个值存储在sum中。在此之后,将返回function f(b),并在sum中维护临时结果。对于每个连续的调用,您执行函数f -您执行sum += b并再次返回f。如果需要字符串上下文(例如在alertconsole.log中),则调用f.toString,返回结果(sum)。

代码语言:javascript
复制
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
}

解释:

代码语言:javascript
复制
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
票数 19
EN

Stack Overflow用户

发布于 2013-08-15 19:55:02

需要查看的是这段代码

代码语言:javascript
复制
function f(b) {
    sum += b
    return f
  }

此函数返回对自身的引用,因此可以尽可能多次地调用它。关于它的一个重要的事情是它有一个可以被调用的tostring函数,因为tostring是在函数sum()中定义的,所以它可以访问变量sum和它的值current value (由f()更改)

票数 3
EN

Stack Overflow用户

发布于 2013-08-15 19:52:52

alert需要一个字符串。如果它没有获得字符串,它将尝试将它接收到的任何对象(而函数是一种对象)转换为字符串。如果对象具有toString方法,则将调用该方法来执行上述转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18252084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档