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

标签 javascript dart closures

在调用第一个函数之前,我本以为此 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/

相关文章:

javascript - 如何对 TypeScript 类执行 Joi 验证?

flutter - 如何正确实例化 didChangeDependencies 中的 bloc?

javascript - 函数 js 中的函数

javascript - ReferenceError 尝试在 Node.js 中的等待回调中访问闭包变量

javascript - 使用带有按钮的JS函数来显示变量

javascript - 如何测试跨平台应用程序

javascript - Jquery Focus 不适用于输入

dart - 如何在flutter中为PhysicalModel添加涟漪效果

flutter - 在类的每个方法中使用需要异步的变量

javascript - 这是一个javascript闭包吗?