5

Despite all known blogs about this issue i always doubt some results and my personal tests shows that the well-said standard isn't the best.

Declaring variables inside the loop, to keep them close to its scope and make it faster to be reached by the method but allocating more memory or declaring outside the for scope to save memory allocation but increase processing to iterate in a distant instance.

My results shows that method B is faster(sometimes), i want to know the background around this.

results vary and im not a bit-brusher guru.

So what you guys think about it?

Method A

var object:Object = new Object();
var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
    object = new Object();
    object.foo = foo;
    object.bar = bar;
}

OR

Method B

var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
    var object:Object = new Object()
    object.foo = foo;
    object.bar = bar;
}
4

2 回答 2

11

AS3 编译器将所有变量声明移动到称为变量提升的方法的顶部。变量的最小范围是一个完整的方法。您的方法 B 等效于以下内容:

var loop:int = 100000;
var i:int;
var object:Object;
for (i = 0; i < loop; i++) {
    object = new Object();
    object.foo = foo;
    object.bar = bar;
}

请注意,它只会向上移动声明,而不是与 this 关联的赋值。这就是您可以在使用后声明变量的原因。例如试试这个代码:

trace(a);
var a:int = 10;
trace(a);

这将编译。这是因为这段代码相当于:

var a:int;
trace(a);
a = 10;
trace(a);

这也是您将使用以下代码收到重复变量声明警告的原因:

for (var i:int = 0; i < m; i++) {

}
for (var i:int = 0; i < n; i++) { // i is already declared once

}

AS3、JS中变量作用域的概念与C、C++、Java等不同。

于 2012-05-24T18:23:01.937 回答
9

tldr; 它们在语义上是等效的并且执行相同。

两种情况下都只调用了一个变量。ActionScript 与 JavaScript 一样,“提升”声明。也就是说,实际上只是一个函数范围的注解。这与 C 和 Java 不同,后者在第二种情况下创建一个新的范围(以及新的变量)。objectvar

但是,AS 没有区别。引擎有效地将第二个代码与第一个代码相同。(话虽如此,我更喜欢“var靠近”它的使用位置,同时理解它与范围无关并且与性能无关。)

请参阅Action Script 3.0:变量,尤其是 Scope 部分:

变量的范围是代码中可以通过词法引用访问变量的区域... 在 ActionScript 3.0 中,变量总是被分配给声明它们的函数或类的范围。

快乐编码。

于 2012-05-24T18:18:32.637 回答