javascript - 试图绕过 Dart 中的闭包
问题描述
我目前正在学习 Google Dart。我目前在试图理解从飞镖文档中取出的这段代码中发生了什么感到困惑:
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?
我希望我说得通。
解决方案
makeAdder
接受一个参数 ( addBy
) 并返回一个也接受一个参数 ( i
) 的函数。
当你调用var add2 = makeAdder(2)
时,这里的参数2
被传递给addBy
,函数返回一个等价于:
num add2(num i) {
return 2 + i;
}
稍后当您调用时add2(3)
,参数3
将传递给i
.
关键是要理解makeAdder
返回一个带参数的函数。
推荐阅读
- flutter - HTTP 请求失败,状态码:403,https://maps.googleapis.com/maps/api/staticmap?
- java - PostgreSQL & JDBC“查询返回了多个结果集”
- html - 相对路径上内容的 Http 重定向
- sql - 为每个文件的每一行添加一个标识符列。并为每个文件名应用索引
- c# - 如何在EF Core中按具有不同实体名称的多个列进行分组 - C#
- python - 如何在任务栏中不显示程序的情况下运行 python 代码
- android - RecyclerView OnClick 侦听器返回错误
- python - 在单行中打印列表元素但不使用循环
- python - grep 父 pom 版本并替换为新值
- android - 仅安装了设备凭据的 Androidx.biometric 不会在具有 Android 9 及以下版本的设备上调用回调