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