Well, one simple fix might be to move all functions before variables. This 
should work because functions are not evaluated until they are run.

I think there is a bigger issue which I’m running into in other classes: I’m 
getting all kinds of errors which I think are due to the order of classes being 
loaded. During class initialization, I’m getting errors that other classes are 
not found.

While thinking abut this, I came to the conclusion that class initializers and 
instance initializers are probably the way to go. The initializer functions can 
reassign themselves to do nothing to ensure they are only run once.

Something like this:

MyClass._init_class_ = function(){
//Do class initialization stuff including variable and constant assignment
        console.log("running init");
        MyClass._init_class_ = function(){
                // do nothing
        }
}
MyClass(){
        MyClass._init_instance_();
}
MyClass._init_instance_ = function(){
// call _init_instance_ on super
// assign the prototype
MyClass._init_instance_ = function(){
}

}

I’m not positive, but I’m pretty sure that this would eliminate almost all my 
issues.

On Jul 18, 2016, at 7:27 AM, Alex Harui <aha...@adobe.com> wrote:

> 
> 
> On 7/17/16, 11:48 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> The following code (from Base64):
>>              private static const _encodeChars:Vector.<int> = 
>> InitEncoreChar();
>>              private static function InitEncoreChar():Vector.<int>
>>              {  
>>              }  
>> 
>> Trying to run this code in javascript will result in an error that
>> com.sociodox.utils.Base64.InitEncoreChar is not defined. Of course this
>> makes sense based on how the javascript is compiled. (There’s no
>> difference between a private static and a public static other than the
>> comments.)
>> 
>> It’s simple enough to fix this by placing functions before variable
>> assignments.
>> 
>> However, the same code works in Flash no matter which order it’s
>> declared. That’s probably because the code is analyzed before it’s
>> actually run.
> 
> I think it is because functions/methods are created in the class traits,
> which run before the class initializer.
> 
>> 
>> The thing is, that Javascript has the same functionality:
>> 
>> /**
>> * @constructor
>> */
>> com.sociodox.utils.Base64 = function() {
>>      com.sociodox.utils.Base64._encodeChars = InitEncoreChar();
>>      function InitEncoreChar(){
>>        var /** @type {Array} */ encodeChars = new Array(64, true);
>>        var /** @type {string} */ chars =
>> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
>>        for (var /** @type {number} */ i = 0; i < 64; i++) {
>>          encodeChars[i] = chars.charCodeAt(i);
>>        }
>> return encodeChars;
>>              
>>       }
>> };
>> 
>> This will work no matter which order you declare the variable and the
>> function because function declarations are evaluated before code is
>> executed.
>> 
>> I don’t know a way to make this work in JS for public static functions,
>> but for private static functions, this is likely a better pattern. It
>> also makes the functions truly private…
>> 
>> Of course, I have no idea how much work it would be to make FalconJX be
>> able to do this…
> 
> I'm not sure it is worth generating this fancier output, but folks are
> welcome to create an emitter that does.
> 
>> 
>> Thoughts?
> 
> We should fix this someday (probably by creating a class initializer
> function), but since the workaround is simple enough, I'd say file a bug
> but defer it to a future release.
> 
> -Alex
> 

Reply via email to