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