[ 
https://issues.apache.org/jira/browse/FLEX-34897?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Piotr Zarzycki updated FLEX-34897:
----------------------------------
    Fix Version/s: Apache FalconJX 0.5.0

> Scope is wrong when calling member function from a variable reference
> ---------------------------------------------------------------------
>
>                 Key: FLEX-34897
>                 URL: https://issues.apache.org/jira/browse/FLEX-34897
>             Project: Apache Flex
>          Issue Type: Bug
>          Components: FalconJX
>    Affects Versions: Apache FalconJX 0.5.0
>            Reporter: Josh Tynjala
>            Assignee: Alex Harui
>             Fix For: Apache FalconJX 0.5.0
>
>
> In Flash Player, when you save a reference to a member function in a 
> variable, you can call the function reference, and "this" will still be bound 
> to the instance where it came from.
> public class Test
> {
>     public function Test()
>     {
>         this.func();
>         var func:Function = this.func;
>         func();
>     }
>     private function func():void
>     {
>         trace(this); //in Flash, "this" will always be an instance of Test
>     }
> }
> Basically, in the code above, the two calls to func() will behave the same in 
> Flash Player. However, in the current implementation of the transpiler, that 
> behavior is lost. When the variable reference to the function is called, 
> "this" ends up referring to the global window object instead.
> JavaScript function objects have a bind() function that let's you set what 
> "this" will refer to when the function is called:
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
> After modifying my code to use bind(), the two calls to func() will behave 
> the same:
> public function Test()
> {
>     this["func"] = this.func.bind(this);
>     this.func();
>     var func:Function = this.func;
>     func();
> }
> Would it be possible for the transpiler to automatically bind all member 
> functions to the correct scope to preserve the behavior that AS3 developers 
> expect?
> Event listeners are the typical use case where you'd pass a reference to a 
> member function somewhere else where a reference needs to be saved in a 
> variable. AS3 in Flash Player makes this easy by automatically binding all 
> member functions to the instance. JavaScript usually requires some manual 
> intervention to get event listeners to be called with the right scope.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to