Thanks a lot T.J.
I will read your answer carefully later on, but it looks very complete and
clear!!!!

I really appreciate your help.

---
Omar Adobati


On Wed, Mar 24, 2010 at 15:08, T.J. Crowder <t...@crowdersoftware.com> wrote:

> Hi Omar,
>
> In the general case, you can reference a function simply by using its
> name whenever it's "in scope," which is to say, if you could call it.
> So:
>
>    function foo() {
>        alert("Hi from foo!");
>    }
>    function bar(func) {
>        func();
>    }
>    foo();
>    bar(foo);
>
> ...results in two alerts, the first from `foo` directly, the second
> from calling `bar` and giving it a reference to `foo` as an argument,
> which it then calls. (In this example, it happens that `bar` could
> also have just called `foo` directly, but ignore that.) Note that when
> we called `bar`, *we* didn't call `foo` (there are no parentheses
> after it), we passed a *reference* to it into `bar` (which then called
> it -- but it didn't have to, it could have remembered it to call later
> for some reason).
>
> A function is in scope if it's defined in the current function or any
> containing function (with top level global space effectively being a
> function). So:
>
>    function charlie() {
>        bar(foo);
>        function foo() {
>            alert("Hi from foo!");
>        }
>    }
>    function bar(func) {
>        func();
>    }
>    charlie(); // <= That's fine, shows alert
>    foo();     // <= syntax error, `foo` is undefined
>    bar(foo);  // <= syntax error, `foo` is undefined
>
> In the above, `foo` is defined within `charlie` but not outside of it.
> If we defined other functions within `charlie`, they'd also have
> access to `foo`. `bar` doesn't have access to `foo`, but when
> `charlie` calls `bar` it passes in the function reference to `foo` as
> an argument. `bar` has access to its arguments (obviously!) and so can
> call the function that way. (A function within a function is sometimes
> called a "closure" because it has access to the data in the function
> that surrounds it. `foo` is a closure within `charlie`.)
>
> In your specific situation, I'm not clear what it is you're trying to
> achieve with those arguments, so I can't really help with what
> function references you'd use. Also, very few of your functions
> actually have names (most of them are anonymous functions bound to
> object properties -- the properties have names, but the functions
> don't, so you can only refer to the functions via the object
> properties). I think that if you're subclassing Ajax.Request, you
> wouldn't need to pass arguments at that point in the options if you're
> trying to refer to the functions that your subclass has attached to
> properties with those names; you'd use them directly in the subclass,
> e.g.:
>
>    initialize: function($super, url, options) {
>           var opts;
>
>          // Create our options, starting with what the user supplied
>          opts = Object.extend({}, options);
>
>          // ...and adding in our handlers
>          opts.onSuccess = this.success.bind(this);
>          opts.onException = this.error.bind(this);
>          /* ...etc... */
>
>          // Set some other stuff
>           this.setUserID(options.usr);
>          this.setPassword(options.pwd);
>          this.setType(options.type);
>
>           // Determine the URL
>           var url = this.setUrl(this.getUserID(), this.getPassword(),
> this.getType());
>
>           // Pass our updated options on to $super
>          $super(url, opts);
>    }
>
> ...but that's kind of a guess. (Also note that I'm using Function#bind
> to ensure that when your handlers get called, they get called with the
> right `this` value -- because you're using an instance, so I'm
> guessing you want access to the instance data.)
>
> There's a lot of info and jargon above, sorry about that. These blog
> posts may be useful:
>
> Regarding scope, there's some here:
>
>
> http://blog.niftysnippets.org/2008/03/when-you-absolutely-positively-need-new.html
>
> ...and a *lot* more here, as well as more information on closures:
>
> http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html
>
> Regarding function names vs. property names:
>
> http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html
>
> And separately, the API docs for Function#bind:
>
> http://api.prototypejs.org/language/function.html#bind-instance_method
>
> HTH,
> --
> T.J. Crowder
> Independent Software Consultant
> tj / crowder software / com
> www.crowdersoftware.com
>
>
> On Mar 24, 1:11 pm, 0m4r <omar.adob...@gmail.com> wrote:
> > Wow, thanks T.J.!!
> > your answer makes a lot of sense.. but, now, how I am supposed to pass
> > a function name instead of a string?
> > I'm sorry if the question sounds stupid to you but I don't know how to
> > achieve this target.
> >
> > Thanks
> >
> > Omar
> >
> > On Mar 24, 12:55 pm, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
> >
> >
> >
> > > Hi,
> >
> > > In this code:
> >
> > > function click() {
> > >         var opt = {
> > >                         method: 'get',
> > >                         onCreate: 'create',
> > >                         onLoading: 'loading',
> > >                         onSuccess: 'sucess',
> > >                     onException: 'error'
> > >                 };
> > >         var login = new jsTTALogin(URL, opt);
> >
> > > }
> >
> > > ...you're providing strings instead of functions. That's causing an
> > > exception, which Prototype then tries to handle via `onException` --
> > > but `onException` is *also* a string, not a function. The error
> > > message in Firefox+Firebug is wrong (interestingly). It's triggered
> > > from line 1540 in Prototype.js:
> >
> > > 1539 dispatchException: function(exception) {
> > > 1540   (this.options.onException || Prototype.emptyFunction)(this,
> > > exception);
> > > 1541   Ajax.Responders.dispatch('onException', this, exception);
> > > 1542 }
> >
> > > ...which resolves to:
> >
> > >     "error"(this, exception)
> >
> > > ...and of course, "error" is a string, not a function.
> >
> > > So that's what's going wrong. It looks to me like you're trying to
> > > pass the names of functions that exist in your subclass as options.
> > > That's not how you reference functions, you need to provide a function
> > > reference.
> >
> > > Off-topic: I'm a bit surprised that `initTTA` in jsTTA.js works (but
> > > it does seem to), it seems to me that it's trying to call `eval` on a
> > > script element, which I would expect to have...undefined results. You
> > > can (and probably should) drop that `eval` and it should work just
> > > fine, more here:
> http://proto-scripty.wikidot.com/prototype:how-to-load-scripts-dynami...
> >
> > > HTH,
> > > --
> > > T.J. Crowder
> > > Independent Software Consultant
> > > tj / crowder software / comwww.crowdersoftware.com
> >
> > > On Mar 24, 10:45 am, Omar Adobati <omar.adob...@gmail.com> wrote:
> >
> > > > Hi T.J.
> > > > I've set up a small minimum failing test here:
> http://www.adobati.it/test/
> > > > <http://www.adobati.it/test/>I have the same error as described
> above:
> >
> > > > ==
> > > > Prototype.emptyFunction is not a function
> > > > (this.options.onException || Prototype.emptyFunction)(this,
> exception);
> > > > ==
> >
> > > > Thanks,
> >
> > > > Omar
> >
> > > > On Wed, Mar 24, 2010 at 10:26, T.J. Crowder <
> t...@crowdersoftware.com> wrote:
> > > > > Hi,
> >
> > > > > Again, why not just create a minimum failing test case? Start
> here[1],
> > > > > add your subclass, and if it breaks post the code.
> >
> > > > > [1]http://proto-scripty.wikidot.com/self-contained-test-page
> >
> > > > > -- T.J.
> >
> > > > > On Mar 23, 4:39 pm, 0m4r <omar.adob...@gmail.com> wrote:
> > > > > > fixing a typo:
> >
> > > > > > ==
> > > > > > var options = {user: 'myuser', pwd:'mypwd', type:'myType',
> > > > > > onSuccess:'success', onException:'error'};
> > > > > > var url = 'http://www.url.com';
> > > > > > var myAjax = new myAjaxR(url, options)
> > > > > > ==
> >
> > > > > --
> > > > > You received this message because you are subscribed to the Google
> Groups
> > > > > "Prototype & script.aculo.us" group.
> > > > > To post to this group, send email to
> > > > > prototype-scriptacul...@googlegroups.com.
> > > > > To unsubscribe from this group, send email to
> > > > > prototype-scriptaculous+unsubscr...@googlegroups.com<prototype-scriptaculous%2bunsubscr...@googlegroups.com><prototype-scriptaculou
> s%2bunsubscr...@googlegroups.com <s%252bunsubscr...@googlegroups.com>>
> > > > > .
> > > > > For more options, visit this group at
> > > > >http://groups.google.com/group/prototype-scriptaculous?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Prototype & script.aculo.us" group.
> To post to this group, send email to
> prototype-scriptacul...@googlegroups.com.
> To unsubscribe from this group, send email to
> prototype-scriptaculous+unsubscr...@googlegroups.com<prototype-scriptaculous%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/prototype-scriptaculous?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptacul...@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.

Reply via email to