gpt4 book ai didi

javascript - 谷歌 Dartlang 中关闭的奇怪行为

转载 作者:行者123 更新时间:2023-11-29 16:12:55 26 4
gpt4 key购买 nike

在调用第一个函数之前,我本以为此 Dart 程序中的整数“i”已设置为 9。然而这个程序的输出是...

0, 2, 4, 6, 8, 10, 12 ,14, 16, 18

当我通常期望 10、11、12、13... 时,就像 JavaScript、C# 等一样。

Dart Lang 输出:0, 2, 4, 6, 8, 10, 12 ,14, 16, 18

typedef int TestFun(int x);

void main()
{
List<TestFun> functionList = new List<TestFun>();

for ( int i = 0; i < 10; i++) {
functionList.add( (int x) => x + i );
}

for ( int j = 0; j < 10; j++)
{
print(functionList[j](j));
}
}

等效的 JavaScript.... 输出 10,11,12...

var functionList = new Array;

for ( var i = 0; i < 10; i++) {
functionList[i] = function (x) { return x + i } ;
}

for ( var j = 0; j < 10; j++) {
alert( functionList[j](j) );
}

等效的 C#.... 输出 10,11,12...

public delegate int TestDel(int x);

public static void Main(string[] args)
{
IList<TestDel> functionList = new List<TestDel>();

for ( int i = 0; i < 10; i++)
{
functionList.Add((int x) => x + i);
}

for ( int j = 0; j < 10; j++)
{
System.Console.WriteLine(functionList[j](j));
}
}

这是 Dart 的错误吗?有人可以向我解释这种行为吗?

最佳答案

Dart 在这里故意避免了 JavaScript 容易出错的行为。声明自己变量的 for 循环将在每次迭代中拥有该变量的新版本。这适用于 for(var x = ...;;)for (var x in ...) (在后一种情况下,变量甚至可以是最终的)。

示例显示每次迭代都引入了一个新的自变量:

class Box {
final Function set;
final Function get;
Box(this.get, this.set);
String toString() => "[${get()}]";
}
main() {
var boxes = [];
for (int i = 0; i < 5; i++) {
boxes.add(new Box(()=>i, (x) { i = x; }));
}
print(boxes); // [[0], [1], [2], [3], [4]]
for (int i = 0; i < 5; i++) {
boxes[i].set(i * 2 + 1);
}
print(boxes); // [[1], [3], [5], [7], [9]]
}

关于javascript - 谷歌 Dartlang 中关闭的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23222611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com