Google Dartlang中关闭的奇怪行为

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吗?有人可以向我解释这种行为吗?

lrn*_*lrn 6

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)