1

我一直在用 ActionScript (Haxe) 编写一些东西,并遇到了这个非常具体的问题。

这是代码(伪:S):

var func:Array = new Array(256);
(A) var i:Int = 0;
for(;i<256;i++) {  // OR // for(i in 0...256) {
  func[i] = function() { trace(i); }
}

func[0]();
func[127]();
func[256]();

上面的代码输出(a):

256
256
256

我希望是(b):

0
127
256

这不会发生,因为 ActionScript/Haxe 正在将 i 的引用分配给函数,并且由于在对函数进行评估的循环结束时 i 等于 256,这就是我得到 (a) 的原因。

有谁知道避免这种情况并在 (b) 处获得预期结果的方法?

感谢你们所有人和你们的回答。

我想我找到了答案。如果您删除标有 (A) 的行,它可以工作,如果您离开它,它不会。我很确定你们都可以弄清楚为什么会发生这种情况。再次感谢!

4

2 回答 2

2

不需要使用回调,这应该可以按预期工作(haxe 在每个循环中创建一个本地变量):

var func = [];
for(i in 0...256)
  func[i] = function() trace(i);

func[0]();
func[127]();
于 2011-06-28T17:13:03.820 回答
2

您展示的是预期/期望的行为。要保留“i”的值,您必须使用“回调”:

/* not pseudo code ;) */

var func = [];
for(i in 0...256)
  func[i] = callback(function(v) trace(v), i);

func[0]();
func[127]();
func[256]();
于 2011-06-17T22:32:43.483 回答