ant*_*pes 2 javascript closures dart
我希望在第一个函数被调用之前,这个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));
}
}
Run Code Online (Sandbox Code Playgroud)
等效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) );
}
Run Code Online (Sandbox Code Playgroud)
等价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));
}
}
Run Code Online (Sandbox Code Playgroud)
这是Dart bug吗?有人可以向我解释这种行为吗?
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]]
}
Run Code Online (Sandbox Code Playgroud)