flutter - Dart:嵌套函数中的变量如何绑定到父级的局部变量?
问题描述
我在循环中创建元素,并且每个元素都需要不同的回调值。这段代码做到了:
for (var obj in objects) {
result.add(
content: GestureDetector(
child: Text(obj.title),
onTap: () => widget.onTap(obj), // Correct object is bound on each loop iteration.
),
);
}
然而,这有不同的工作方式:
var obj;
for (var i = 0; i < objects.length; i++) {
obj = objects[i];
result.add(
content: GestureDetector(
child: Text(obj.title),
onTap: () => widget.onTap(obj), // Always get the last object in array.
),
);
}
后者实际上是预期的,而前者让我想知道为什么它首先会起作用。看起来像var
在每次迭代中创建一个新变量,并保留在绑定中。我的问题是:
- 这种绑定的确切机制是什么?究竟是什么创造了一个新的范围?是否记录在案?
var
循环会影响性能和内存吗?如果我不需要绑定,var i; for (i = ...
总比for (var i = ...
因为它不会var
在每次迭代时创建 s 更好吗?
解决方案
#1 ...绑定通常被称为“闭包绑定”,因为超出闭包范围但仍在闭包中的代码范围内的变量实际上是绑定的一部分。
至于您的 #2 问题,如果没有人在闭包中捕获值,则所有迭代都使用相同的变量,因此您无需对速度进行微优化。
推荐阅读
- c++ - 如何以编程方式清除 Windows 上的内部 Google Chrome DNS 缓存?
- python - 使用 Beautifulsoup 进行 Python 网页抓取:lowes 商店
- node.js - 我正在尝试制作一个不和谐的机器人,但我无法运行它
- python - 该函数在 Tkinter 中自行打开
- c# - Mac 的 kernel32.dll 是否有替代方案?
- java - 无法启动 .exe 文件。使用 Launch4j 3.12
- f# - 如何从 C#/WPF 使用的接口创建 F# 列表
- string - 2 个相等的字符串(预期状态和当前状态)评估为 false
- r - Docker 镜像与单一导入的同一镜像之间的不同行为
- probability - 有向循环概率图 - 所有可能路径的概率