"var self = this;” is added to every method that has inner/local
functions.  Use of "this" in local functions is changed to use "self" in
order to get AS scoping in JS.  I think we currently generate a self=this
even if the local functions don't need it.  Someday the compiler will be
smarter about that.


If the compiler is now generating self=this where there are no local
functions, that would be a bug.

-Alex

On 7/17/17, 2:23 PM, "Harbs" <harbs.li...@gmail.com> wrote:

>The places that I checked look good.
>
>Side question: Despite the fact that “this” is no longer used in the
>callLater function, I noticed that the compiler is inserting "var self =
>this;” at the start of the function.
>
>I don’t think it causes any harm, but it does cause a Google compiler
>warning and I’m curious as to why it’s being output.
>
>> On Jul 17, 2017, at 10:36 PM, Harbs <harbs.li...@gmail.com> wrote:
>> 
>> I’m not going to claim I understand what you just wrote. ;-)
>> 
>> I’ll see if I can understand the output…
>> 
>> Thanks.
>> 
>>> On Jul 17, 2017, at 10:33 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>wrote:
>>> 
>>> Thinking about it more, I think a parameter of type Function never
>>>needs
>>> to be wrapped.  It would get wrapped on any assignment in the function
>>> body.  I just pushed changes to reflect that.
>>> 
>>> -Alex
>>> 
>>> On 7/16/17, 11:41 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote:
>>> 
>>>> Seems reasonable to add a check to see if the function body is for a
>>>> static method.
>>>> 
>>>> -Alex
>>>> 
>>>> On 7/16/17, 11:25 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>> 
>>>>> A directive could be a solution.
>>>>> 
>>>>> But I think this is an issue with any static method. If a closure is
>>>>>used
>>>>> inside a static method, or a function declared inside a static
>>>>>method, it
>>>>> should not use Language.closure.
>>>>> 
>>>>> FWIW, the Google compile complains about “this” being used in a
>>>>>static
>>>>> method as well:
>>>>> 
>>>>>  [mxmlc] Jul 16, 2017 7:26:08 PM
>>>>> com.google.javascript.jscomp.LoggerErrorManager println
>>>>>  [mxmlc] WARNING:
>>>>> 
>>>>>/Users/harbs/Documents/ApacheFlex/flex-asjs/examples/flexjs/DebuggingE
>>>>>xam
>>>>> p
>>>>> le/bin/js-debug/org/apache/flex/utils/callLater.js:35: WARNING -
>>>>> dangerous use of this in static method
>>>>>org.apache.flex.utils.callLater
>>>>>  [mxmlc]   
>>>>> setTimeout(org.apache.flex.utils.Language.closure(makeCalls, this,
>>>>> 'makeCalls'), 0);
>>>>> 
>>>>> Package level functions should be treated as static methods.
>>>>> 
>>>>> It might not be a bad idea to add a directive to allow developers to
>>>>> avoid Language.closure calls at will, but I think the “correct”
>>>>>general
>>>>> solution is to never output Language.closure in static and package
>>>>>level
>>>>> functions.
>>>>> 
>>>>>> On Jul 17, 2017, at 9:16 AM, Alex Harui <aha...@adobe.com.INVALID>
>>>>>> wrote:
>>>>>> 
>>>>>> I don't see any current way to suppress the Language.closure.
>>>>>>Without
>>>>>> flow-analysis, I'm not sure the compiler can tell.  It could guess
>>>>>>that
>>>>>> the identifier is a parameter, but the parameter variable could be
>>>>>> assigned within the function body.
>>>>>> 
>>>>>> We could add a new directive like @flexjsisclosure or something like
>>>>>> that.
>>>>>> 
>>>>>> Thoughts?
>>>>>> -Alex
>>>>>> 
>>>>>> On 7/16/17, 10:05 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>>>> 
>>>>>>> I figured out the problem.
>>>>>>> 
>>>>>>> org.apache.flex.utils.callLater has the following code:
>>>>>>> setTimeout(makeCalls, 0);
>>>>>>> 
>>>>>>> That compiles to:
>>>>>>> setTimeout(org.apache.flex.utils.Language.closure(makeCalls, this,
>>>>>>> 'makeCalls'), 0);
>>>>>>> 
>>>>>>> When Language.closure is called, it messes up the scope of the
>>>>>>>calls
>>>>>>> variable and subsequent calls to makeCalls step on each other. I
>>>>>>> believe
>>>>>>> this is because makeCalls is bound to the package object of the
>>>>>>> callLater
>>>>>>> function.
>>>>>>> 
>>>>>>> Is there any way to prevent rewriting of function calls to
>>>>>>> Language.closure?
>>>>>>> 
>>>>>>> If "setTimeout(makeCalls, 0);" is cross-compiled exactly to:
>>>>>>> "setTimeout(makeCalls, 0);", it works like I’d expect it to.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Harbs
>>>>>>> 
>>>>>>>> On Jul 16, 2017, at 3:46 PM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>> Interesting to note:
>>>>>>>> 
>>>>>>>> Adding a number of callLater() calls resulted in only the first
>>>>>>>>one
>>>>>>>> being called in JS. I did not try as a SWF.
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
>

Reply via email to