在写for循环的时候都习惯将geter(如:arrList.length)提到循环外,目的是为了提高效率,那么for~each会不会遇到相同的问题?
下面给出了一个测试,证明了引用的geter只调用了一次,不存在for循环对geter(如:arrList.length)按照循环次数执行的情况。
类A:
package{ public class A{ private var _obj:Object; public function A(){ _obj = {}; } public function get obj():Object{ trace(“get obj”); // 每当被访问此属性时,都会输出”get obj” return _obj; } } }
测试代码:
var a:A = new A();
var obj:Object = a.obj; // 在这里 a.obj 属性被访问一次
obj.a = “a”;
obj.b = “b”;
obj.c = “c”;
obj.d = “d”;
obj.e = “e”;
obj.f = “f”;
for each (var o:* in a.obj) // a.obj 属性只在第一次被访问,前后总共被访问两次
{
trace(“for each”);
}
var obj:Object = a.obj; // 在这里 a.obj 属性被访问一次
obj.a = “a”;
obj.b = “b”;
obj.c = “c”;
obj.d = “d”;
obj.e = “e”;
obj.f = “f”;
for each (var o:* in a.obj) // a.obj 属性只在第一次被访问,前后总共被访问两次
{
trace(“for each”);
}
最终输出的结果是:
get obj
get obj
for each
for each
for each
for each
for each
for each
get obj
for each
for each
for each
for each
for each
for each
“get obj” 只输出了两次,说明了 for each 语句里,a.obj 属性只被访问了一次。之后的循环里,都没有被访问了。