Because I'm an advocate for licensing and was told I probably should
mention:  the 'rescope' function is a stripped down version of Dojo's
dojo.hitch function. Infinitely useful in the real world, but
technically if used [in production] should retain attribution. It is
available under new BSD and AFL terms, (c) Dojo Foundation.

Glad you liked it, and hope you can use it. It really is one of my
favorite shorthand helpers there is. The cousin [dojo.partial] is
useful as well, but not in this context.

Regards,
Peter Higgins

On Fri, Jan 2, 2009 at 9:12 PM, Alexandre Plennevaux
<aplennev...@gmail.com> wrote:
>
> nice example, now i think i get it.
>
> Indeed actionscript (v2 at least) is based on ecmascript, much like
> javascript if i'm not mistaken.
> I came to web design/dev from actionscript one and gradually made my
> way to jquery. Anyway, actionscript keeps you away from the internal
> cooking by using a metaphor, "timeline": basically you work with
> objects and organise them on a main timeline, "_root" (or "_level0").
> Each object has its own timeline, can be put inside another object, so
> you would address it as _root.myStepMother.face.hairyChin;
>
> I wrongly assumed javascript would allow me to do it for
> setInterval(). hehe, how boring would be the world without all these
> little variations, now wouldn't it :) ?
> That's pretty much the problem with using metaphors: it's nice to get
> you fast into a certain task, but you have to actually break it up to
> be able to master the technology behind.
>
> Thank you Mike and Peter for your excellent help !
>
>
> On Sat, Jan 3, 2009 at 2:44 AM, Michael Geary <m...@mg.to> wrote:
>>
>> Thanks, Alexandre, it's kind of you to say that.
>>
>> About this code...
>>
>>> datascape.myInterval = setInterval(window.datascape.move,400);
>>
>> Let's break it down a little. It's exactly the same as doing:
>>
>>  var callback = window.datascape.move;
>>  datascape.myInterval = setInterval( callback, 400 );
>>
>> As you can see from this code, JavaScript doesn't "remember" that the
>> callback function was a property of the datascape object. When you get a
>> reference to the function, that's all you get, a reference to the function
>> itself, without any information about what object the function may have been
>> a method of. So when setInterval calls the function later, it just calls it
>> as a plain old function, and "this" is the global/window object.
>>
>> Doesn't ActionScript work the same way? It may have a different global
>> object, but I thought most of the JavaScript semantics were similar except
>> for the ActionScript extensions. I haven't worked with ActionScript so I
>> don't know.
>>
>> -Mike
>>
>>> From: Alexandre Plennevaux
>>>
>>> Michael, did you know that i 'm becoming a big fan of your
>>> explanations?
>>>
>>> if i follow your explanation correctly, this should have
>>> worked, isn't it ?
>>>
>>> datascape.myInterval = setInterval(window.datascape.move,400);
>>>
>>> Yet it didn't. I guess i 'm kind of assimilating the
>>> javascript window object to actionscript's _root object, and
>>> that assumption is probably plain wrong :)
>>>
>>>
>>> On Fri, Jan 2, 2009 at 11:49 PM, Michael Geary <m...@mg.to> wrote:
>>> >
>>> > Hi Alexandre,
>>> >
>>> > Don't go adopting a coding practice just because of a
>>> single mailing
>>> > list message. :-)
>>> >
>>> > There's nothing wrong with quoting property names in an object
>>> > literal, but the majority of experienced JavaScript
>>> programmers do not
>>> > quote them except when necessary. As an example, browse
>>> through the jQuery source code:
>>> >
>>> > http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js
>>> >
>>> > Most of the property names in the code are not quoted, except for
>>> > those few that are invalid identifiers or reserved words.
>>> >
>>> > Regarding setTimeout and setInterval, a minor nitpick on
>>> terminology:
>>> > "setTimeout and setInterval scope the called function to
>>> the window object".
>>> > Actually, the *scope* of the called function is determined by its
>>> > position in the source code. JavaScript uses lexical
>>> scoping, where a
>>> > nested function can directly refer to variables declared in outer
>>> > functions or in the global scope. That's why your
>>> setInterval callback
>>> > is able to use your thisObj variable, because the
>>> interpreter follows
>>> > the scope chain from the inner function up to the outer
>>> function and finds the variable there.
>>> >
>>> > What you're talking about is the value of "this" in the setInterval
>>> > callback. setInterval and setTimeout call your callback
>>> function as a
>>> > method of the global object (which is the window object in
>>> a browser).
>>> > Or another way to put it is that they don't call the function as a
>>> > method of any object at all, and by default "this" is set
>>> to the global object.
>>> >
>>> > In any case, terminology nitpicks aside, your code is the
>>> right way to
>>> > solve the problem! :-)
>>> >
>>> > -Mike
>>> >
>>> >> From: Alexandre Plennevaux
>>> >>
>>> >> hi donb, according to a lengthy discussion we had on this
>>> mailinglist
>>> >> yesterday the quotes are good practice. see:
>>> >> http://groups.google.com/group/jquery-en/msg/821f4eb134c51d3d
>>> >>  (is is just one message on a 31-long thread, if u have time ,read
>>> >> the whole thread it is interesting )
>>> >>
>>> >> As for this issue after extensive googling i found out that
>>> >> setTimeout and setInterval scope the called function to the window
>>> >> object, not the object the setinterval is called in.
>>> >>
>>> >> Therefore here is how to do it:
>>> >>
>>> >> var datascape = {
>>> >>    'mouseX': 0,
>>> >>     'myInterval': 0,
>>> >>     'create': function(){
>>> >>
>>> >>  var thisObj = this;  //<-- store this object instance in
>>> a variable
>>> >>
>>> >>    $('#datascape').bind('mousemove', function(e)
>>> >>          {
>>> >>              this.mouseX = e.pageX;
>>> >>          }).bind("mouseover", function()
>>> >>          {
>>> >>              datascape.myInterval = setInterval(function() {
>>> >> thisObj.move(); }, 1000);  // <-- use the vairable referencing the
>>> >> instance
>>> >>
>>> >>          }).bind("mouseout", function()
>>> >>          {
>>> >>              clearInterval(datascape.myInterval);
>>> >>          });
>>> >>     },
>>> >>
>>> >>     'move': function(){
>>> >>            $.log('datascape.move : mouseX = ' + this.mouseX);
>>> >>          }
>>> >>  }
>>> >>
>>> >> On Thu, Jan 1, 2009 at 3:46 PM, donb
>>> >> <falconwatc...@comcast.net> wrote:
>>> >> >
>>> >> > You should change 'move' to move (remove apostrophes).
>>> >> >
>>> >> >
>>> >> > On Jan 1, 9:01 am, "Alexandre Plennevaux" <aplennev...@gmail.com>
>>> >> > wrote:
>>> >> >> Hello mates,
>>> >> >>
>>> >> >> i have an object datascape which among other things, contains a
>>> >> >> property storing the mouse position, and a function
>>> that uses that
>>> >> >> property. Inside another method i
>>> >> >>
>>> >> >> var datascape = {
>>> >> >>    'mouseX': 0,
>>> >> >>    'myInterval': 0,
>>> >> >>    'create': function(){
>>> >> >>        $('#datascape').bind('mousemove', function(e)
>>> >> >>         {
>>> >> >>             this.mouseX = e.pageX;
>>> >> >>         }).bind("mouseover", function()
>>> >> >>         {
>>> >> >>             this.myInterval = setInterval(this.move, 200);
>>> >> >>
>>> >> >>         }).bind("mouseout", function()
>>> >> >>         {
>>> >> >>             clearInterval(this.myInterval);
>>> >> >>         });
>>> >> >>    },
>>> >> >>
>>> >> >>    'move': function(){
>>> >> >>           $.log('datascape.move : mouseX = ' + this.mouseX);
>>> >> >>         }
>>> >> >>
>>> >> >> }
>>> >> >>
>>> >> >> Yet the script does not work:
>>> >> >> firebug console points at the setInterval call, saying:
>>> >> >>
>>> >> >> useless setInterval call (missing quotes around
>>> >> >> argument?)http://localhost/prototype/_js/frontend/proto.03.js
>>> >> >> Line 172
>>> >> >>
>>> >> >> can someone help me / explain what i'm doing wrong ?
>>> >> >>
>>> >> >> Thank you,
>>> >> >>
>>> >> >> Alexandre
>>> >> >>
>>> >> >> PS: to all jquerians: happy 2009 !!
>>> >>
>>> >
>>> >
>>>
>>
>>
>

Reply via email to