Loading ...
Sorry, an error occurred while loading the content.

Re: DS_JSFunction calling oFunction from global scope

Expand Messages
  • y_lsmith
    Maybe you need to include the pass through arguments in the anonymous function wrapper? var me = this; this.myACDataSource = new
    Message 1 of 5 , Apr 1 3:40 PM
    View Source
    • 0 Attachment
      Maybe you need to include the pass through arguments in the anonymous function wrapper?

      var me = this;
      this.myACDataSource = new YAHOO.widget.DS_JSFunction(function (a,b,c) {
          me.someFunc(a,b,c);
      });

         
      Or a more broad brush approach:
      var me = this;
      this.myACDataSource = new YAHOO.widget.DS_JSFunction(function () {
          someFunc.apply(me, arguments);
      });


      Hope this helps,
      Luke

      --- In ydn-javascript@yahoogroups.com, "jeremymefford" <jeremymefford@...> wrote:
      >
      > So that worked perfect to fix my scope issue, however now my param
      > from the autocomplete is not getting passed into the function...
      >
      > --- In ydn-javascript@yahoogroups.com, "y_lsmith" lsmith@ wrote:
      > >
      > > Jeremy,
      > >
      > > The JavaScript interpreter dereferences this.someFunc to the function
      > > itself (not the function scoped to the this object) before passing it to
      > > the DS_JSFunction constructor. Functions do not carry their scope with
      > > them; this is determined when they are executing.
      > >
      > > For example:
      > >
      > > var someFunc = function () {
      > > alert(this.name); // who is this?
      > > };
      > >
      > > var MyClass = function (name) {
      > > this.name = name;
      > > this.fooFunc = someFunc;
      > > };
      > >
      > > var MyOtherClass = function (name) {
      > > this.name = name;
      > > };
      > > MyOtherClass.prototype.barFunc = someFunc;
      > >
      > > // this is the window object
      > > someFunc();
      > >
      > > // this is the MyClass instance
      > > new MyClass('foo').fooFunc();
      > >
      > > // this is the MyOtherClass instance
      > > new MyOtherClass('bar').barFunc();
      > >
      > > var baz = { name: 'baz' };
      > > // this is baz
      > > someFunc.call(baz);
      > >
      > > You can avoid the this confusion by creating a closure around your
      > > instance method like so:
      > >
      > > init : function () {
      > > //do stuff
      > >
      > > var me = this;
      > > this.myACDataSource = new YAHOO.widget.DS_JSFunction(function () {
      > > me.someFunc();
      > > });
      > > },
      > >
      > > Hope this helps,
      > > Luke
      > >
      > > --- In ydn-javascript@yahoogroups.com, "jeremymefford"
      > > <jeremymefford@> wrote:
      > > >
      > > > I'm not quite sure how to fix this problem I'm having. I created a
      > > > custom object that contains an autocomplete widget with a datatable.
      > > >
      > > > I used the example off the YUI site that had me use DS_JSFunction for
      > > > my autocomplete widget, however the oFunction that it's calling is
      > > > referenced from the global scope when I want it to be local. I all
      > > > actuality, I'm not even sure how it's calling from the global scope in
      > > > this case.
      > > >
      > > > Here is my situation, in code:
      > > >
      > > > var myObj = function() {
      > > > return {
      > > >
      > > > vars:null,
      > > > init: function() {
      > > >
      > > > //do stuff
      > > > this.myACDataSource = new
      > > YAHOO.widget.DS_JSFunction(this.someFunc);
      > > >
      > > > }
      > > >
      > > > someFunc: function() {
      > > > this.myvar = 'foo';
      > > > }
      > > >
      > > > }
      > > > }
      > > >
      > > > So, when I debug this w/Firebug with a breakpoint on the line
      > > > this.myvar = 'foo', firebug tells me:
      > > >
      > > > this = window test.jsp
      > > >
      > > > I'm so very confused as to how this is the case when clearly the
      > > > function called was in the scope of myObj. I've worked around it by
      > > > calling this.myObjInstance.myvar, but I feel that this is a hack and
      > > > there should be a better way to do this.
      > > >
      > >
      >
    Your message has been successfully submitted and would be delivered to recipients shortly.