Scoping is pretty weird in AS3 for those coming from C/C++ and Java. There are two cases in particular you should know about.

The first you’ll probably see pretty quickly upon starting your AS3 programming:

function printTwice(a:Array): void
{
    for each (var cur:String in a)
    {
        trace(cur);
    }
    for each (var cur:String in a)
    {
        trace(cur);
    }
}

You get this compiler warning twice:

Warning: Array(x) behaves the same as new Array(x).  To cast a
value to type Array use the expression x as Array instead of Array(x).
 
            var a:Array = Array(v);

This betrays what’s going on behind the scenes: there is no loop scope! All local variables are scoped to the function. So there’s a clash here, but it’s OK because the compiler will just pretend that you didn’t declare the second one and instead just re-use the first. This is dangerous, hence the compiler warning.

Recently though, I discovered this evil little variable clash:

function printLength(a:Array): void
{
    var a:Array;
    trace(a.length);
}

Firstly, there are no compiler errors or warnings this time around. There should be. Secondly, say I call printLength([2,4,6]). What do you figure gets printed? The answer is nothing. The a declared in the function overrides the a declared in the arguments list. There is, in fact, no way to reference the argument. So the trace statement is accessing a null reference and you will get a crash. Just like I did. I hope, having read this article, you will be extra vigilant with this. And if you’re not, I at least hope you can debug it faster.