重要度:(3/5) 这个问题看似简单,但 debug 时却难以发现。
数组访问时如果下标使用了函数并且使用了 +=
、-=
、*=
等运算符时需要特别地注意,函数会被调用两次!
比如以下代码:
var i:int = 0; var foo = function():int { trace("foo"); return ++i; } var arr:Array = [1,2,3]; arr[foo()] += 10; trace(arr);
将会输出:
foo; foo; 1,13,3
而正确的输出为:
foo; 1,12,3
这是因为在编译时编译器只做了一下简单的操作:
(a += b) --> (a) = (a) + (b)
以至于将 arr[foo()] += 10;
编译成 arr[foo()] = arr[foo()] + 10;
。
没有评论:
发表评论