首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在Dart中使用闭包

尝试在Dart中使用闭包
EN

Stack Overflow用户
提问于 2018-06-28 21:15:36
回答 2查看 628关注 0票数 3

我目前正在学习Google Dart。我目前在试图理解从dart文档中提取的这段代码中发生的事情时感到困惑:

代码语言:javascript
复制
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

我发现很难理解的是add2(3)add(3)部分。我收集的makeAdder(2)makeAdder(4)在它们自己的作用域中将变量addBy分别赋值为2和4。因此,变量add2将2赋给addBy,变量add4将4赋给addBy。但我不太理解这一点:当使用参数(即add2(3)add4(3))执行函数时,参数不应该分配变量addBy,因此addBy应该分别等于变量的3吗?Dart如何知道将i赋值为3而不是addBy?

我希望我说的有道理。

EN

回答 2

Stack Overflow用户

发布于 2018-06-28 21:26:41

makeAdder接受一个参数(addBy)并返回一个函数,该函数也接受一个参数(i)。

当您调用var add2 = makeAdder(2)时,此处的参数2被传递给addBy,并且该函数返回一个与以下内容等效的lambda:

代码语言:javascript
复制
num add2(num i) { 
  return 2 + i;
}

稍后,当您调用add2(3)时,参数3将传递给i

关键是要理解makeAdder返回一个接受参数的函数。

票数 3
EN

Stack Overflow用户

发布于 2018-06-28 21:52:48

makeAdder在这里返回一个函数。从makeAdder返回的函数基本上是一个closer。一旦你用一个参数调用makeAdder,它的值就会保存在addBy参数中。因此,当您执行像makeAdder(2)(3)这样的调用时,它将返回5。

在简单的javascript中,此函数将如下所示-

代码语言:javascript
复制
var makeAdder = function(addBy) {
    return (param) => { 
        return addBy+param;
    }
}

内部函数只是一个简单的箭头函数。如果我们以makeAdder(5)(6)的形式调用makeAdder,它将返回11

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

https://stackoverflow.com/questions/51083905

复制
相关文章

相似问题

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