[Proto-Scripty] Re: Javascript scope

2009-02-12 Thread T.J. Crowder

Hi again Doug,

  But, my question is, is there a way I can do some type of alert() and
  have it print out what scope it is executing in?

 I don't know of a reliable way to do that, no.

But if you're using Firefox, it looks like the latest Firebug[1] now
displays the scope chain on the watch panel automagically when you're
stepping through code.  VERY cool. :-)

[1] http://www.getfirebug.com
--
T.J. Crowder
tj / crowder software / com
Independent Software Engineer, consulting services available


On Feb 11, 11:39 am, T.J. Crowder t...@crowdersoftware.com wrote:
 Hi Doug,

  I don't really understand, for example why, if there is a variable
  window.myvar, some Javascript code would not be able to access it...

 As far as I know, all code within the same document can access that
 property; it is global to the document because it's a property of the
 window object, which is global to the document.  Offhand, I can only
 think of two situations where it would be in accessible:  1. If you're
 dealing with frames or iframes, those are in separate documents and
 they each get their own copy of window with its own properties; 2.
 If window has been hidden by another declaration called
 window (e.g., a function with var window in it, or someone using
 'with'), which would be a Bad Idea(tm).

  But, my question is, is there a way I can do some type of alert() and
  have it print out what scope it is executing in?

 I don't know of a reliable way to do that, no.  You can get hints at
 it, as with seasoup's note about arguments.callee, but that won't help
 you if you're executing code in the global scope or within an 'exec'.
 But good news:  You can always tell by looking at the source, because
 in JavaScript, scope is dictated by program structure; it's not
 determined at runtime.

 Most of us are familiar with the concept of globals and locals:

 * * * *

 var a = h;

 function doSomething() {

     // 'a' is a global, so this function can see it
     alert(a);

 }

 doSomething();  // alerts h, the current value of 'a'
 a = j;
 doSomething();  // alerts j, the current value of 'a'

 * * * *

 JavaScript takes this to the logical next step:  Functions declared
 within a scope inherit that scope and all of its parent scopes, in a
 chain:

 * * * *
 var a = h;

 function outermost() {
     var b = e;

     function middle() {
         var c = ll;

         function innermost() {
             var d = o;

             alert(a + b + c + d);
         }

         innermost();
     }

     middle();

 }

 outermost();  // alerts hello
 * * * *

 Cool, huh?  Each unqualified reference is resolved by checking it
 against the innermost scope and, if not found there, the next scope up
 in the chain -- in this case, innermost - middle - outermost -
 global.  To know what the scope chain looks like, we need only look at
 where the functions are defined.  This is the crucial bit:  It's where
 they're defined, not where they're called.

 The program structure tells us what variables are in scope for which
 functions, but as always, the *values* of those variables is
 determined at runtime.  It's easy enough to realize that calling
 'outermost' above gives us hello and that that changes if we change
 'a':

 * * * *
 outermost(); // alerts hello
 a = j;
 outermost(); // alerts jello (mm, Jello)
 * * * *

 Simple enough, you've changed a global used by one of the inner
 functions.  We can also do the same thing using a parameter to
 'outermost':

 * * * *

 function outermost(a) {
     var b = e;

     function middle() {
         var c = ll;

         function innermost() {
             var d = o;

             alert(a + b + c + d);
         }

         innermost();
     }

     middle();

 }

 outermost(h); // alerts hello
 outermost(j); // alerts jello

 * * * *

 Note we don't have a global 'a' anymore; it's a parameter of
 'outermost'.  Doesn't matter, parameters go on the scope chain just
 like local variables do.

 Where people start to get a bit glassy-eyed is when we start passing
 around function references, which we do all the time in JavaScript.
 Consider this:

 * * * *

 function outermost(a) {
     var b = e;

     function middle() {
         var c = ll;

         function innermost() {
             var d = o;

             alert(a + b + c + d);
         }

         innermost();
     }

     return middle;

 }

 * * * *

 Note that 'outermost' now returns a reference to the 'middle'
 function, it does *not* call it.  No alert occurs if we call
 'outermost'; it occurs when we call the function returned by
 'outermost'.  Now, what do we see when we do this:

 * * * *

 var f1 = outermost(h);
 f1();

 * * * *

 We call 'outermost' with an h, and it returns a function reference
 we store in 'f1', and then we call the function.  Well, you probably
 said it alerts hello -- and you'd be right!  How 'bout this:

 * * * *

 var f1 = outermost(h);
 var f2 = outermost(j);
 f1();
 f2();

 * * * *

 What do we see when 

[Proto-Scripty] Re: Javascript scope

2009-02-12 Thread RobG



On Feb 11, 11:21 am, doug douglass_da...@earthlink.net wrote:
 I have read about Javascript and scope and I still don't really
 understand it completely, particularly when it comes to Ajax.Updater.

 I don't really understand, for example why, if there is a variable
 window.myvar, some Javascript code would not be able to access it, and
 instead it would be undefined for that code.   I was thinking
 window.myvar was global

Without seeing the code, only guesses can be provided in response to
that.  It may be that myvar hasn't been assigned a value when you try
to access it, or the code is trying to access a different window
object, or the identifier resolves to a property on some other object,
and so on.


 But, my question is, is there a way I can do some type of alert() and
 have it print out what scope it is executing in?

Javascript only has 2 scopes: global and function.  However, there can
be more than one global object in a web page (e.g. frames).

There is a long and detailed article on closures here that includes
how scope works:

URL: http://www.jibbering.com/faq/faq_notes/closures.html 

It is a bit daunting when you first start to read it, but stick at it,
you may take a week or so of solid work to get all the way through and
fully understand it.  But if you take the time, by the end you will
have a very good idea of how identifier (hence scope) and property
name resolution works in javascript.


--
Rob
--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: Javascript scope

2009-02-11 Thread T.J. Crowder

Hi Doug,

 I don't really understand, for example why, if there is a variable
 window.myvar, some Javascript code would not be able to access it...

As far as I know, all code within the same document can access that
property; it is global to the document because it's a property of the
window object, which is global to the document.  Offhand, I can only
think of two situations where it would be in accessible:  1. If you're
dealing with frames or iframes, those are in separate documents and
they each get their own copy of window with its own properties; 2.
If window has been hidden by another declaration called
window (e.g., a function with var window in it, or someone using
'with'), which would be a Bad Idea(tm).

 But, my question is, is there a way I can do some type of alert() and
 have it print out what scope it is executing in?

I don't know of a reliable way to do that, no.  You can get hints at
it, as with seasoup's note about arguments.callee, but that won't help
you if you're executing code in the global scope or within an 'exec'.
But good news:  You can always tell by looking at the source, because
in JavaScript, scope is dictated by program structure; it's not
determined at runtime.

Most of us are familiar with the concept of globals and locals:

* * * *

var a = h;

function doSomething() {

// 'a' is a global, so this function can see it
alert(a);
}

doSomething();  // alerts h, the current value of 'a'
a = j;
doSomething();  // alerts j, the current value of 'a'

* * * *

JavaScript takes this to the logical next step:  Functions declared
within a scope inherit that scope and all of its parent scopes, in a
chain:

* * * *
var a = h;

function outermost() {
var b = e;

function middle() {
var c = ll;

function innermost() {
var d = o;

alert(a + b + c + d);
}

innermost();
}

middle();
}

outermost();  // alerts hello
* * * *

Cool, huh?  Each unqualified reference is resolved by checking it
against the innermost scope and, if not found there, the next scope up
in the chain -- in this case, innermost - middle - outermost -
global.  To know what the scope chain looks like, we need only look at
where the functions are defined.  This is the crucial bit:  It's where
they're defined, not where they're called.

The program structure tells us what variables are in scope for which
functions, but as always, the *values* of those variables is
determined at runtime.  It's easy enough to realize that calling
'outermost' above gives us hello and that that changes if we change
'a':

* * * *
outermost(); // alerts hello
a = j;
outermost(); // alerts jello (mm, Jello)
* * * *

Simple enough, you've changed a global used by one of the inner
functions.  We can also do the same thing using a parameter to
'outermost':

* * * *

function outermost(a) {
var b = e;

function middle() {
var c = ll;

function innermost() {
var d = o;

alert(a + b + c + d);
}

innermost();
}

middle();
}

outermost(h); // alerts hello
outermost(j); // alerts jello

* * * *

Note we don't have a global 'a' anymore; it's a parameter of
'outermost'.  Doesn't matter, parameters go on the scope chain just
like local variables do.

Where people start to get a bit glassy-eyed is when we start passing
around function references, which we do all the time in JavaScript.
Consider this:

* * * *

function outermost(a) {
var b = e;

function middle() {
var c = ll;

function innermost() {
var d = o;

alert(a + b + c + d);
}

innermost();
}

return middle;
}

* * * *

Note that 'outermost' now returns a reference to the 'middle'
function, it does *not* call it.  No alert occurs if we call
'outermost'; it occurs when we call the function returned by
'outermost'.  Now, what do we see when we do this:

* * * *

var f1 = outermost(h);
f1();

* * * *

We call 'outermost' with an h, and it returns a function reference
we store in 'f1', and then we call the function.  Well, you probably
said it alerts hello -- and you'd be right!  How 'bout this:

* * * *

var f1 = outermost(h);
var f2 = outermost(j);
f1();
f2();

* * * *

What do we see when 'f1' is called?  And 'f2'?  The answers, as you
will have realized, are of course hello and jello, respectively.
This is because a function reference includes the execution context of
that function, including the parameters and locals.

Now hang on a minute, you're saying, that parameter I passed into
'outermost' the first time is gone by the time I call 'f1'!  How can
'f1' still reference it?!  The answer is:  The parameter is not
gone.  It would be, if there were no outstanding references to it, but
there *is* an outstanding reference to it -- our 'f1' variable refers
to it.  That 'a' parameter lives on as a property of an object (called
the variable object) within the execution context 

[Proto-Scripty] Re: Javascript scope

2009-02-11 Thread doug

Thanks for the advice every one.

T. J. Crowder,

I wonder if a div with style overflow:auto and a scrollbar on the side
could act similar to a frame.

I figured what makes things go wrong, but still not sure why.  I bring
up a lightbox similar to the one here: 
http://particletree.com/features/lightbox-gone-wild/.
But, when I do an Ajax.Update of the lightbox div, and I have an
onclick on a button in that lightbox.  The code attached to that
button can longer access the global vars.

However, if my lightbox contains a div, and I update the inner div, I
can access the global vars from onclicks within the lightbox. At least
that's what it seems like is happening.  There may be something else
going on, I'm really not sure.

-d


--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: Javascript scope

2009-02-11 Thread T.J. Crowder

Hi,

 I wonder if a div with style overflow:auto and a scrollbar on the side
 could act similar to a frame.

It shouldn't, no.

 But, when I do an Ajax.Update of the lightbox div, and I have an
 onclick on a button in that lightbox.  The code attached to that
 button can longer access the global vars.

Can you post a pared-down, minimalist, self-contained page
demonstrating the problem?  Folks here would be happy to take a
look...
--
T.J. Crowder
tj / crowder software / com
Independent Software Engineer, consulting services available


On Feb 11, 1:23 pm, doug douglass_da...@earthlink.net wrote:
 Thanks for the advice every one.

 T. J. Crowder,

 I wonder if a div with style overflow:auto and a scrollbar on the side
 could act similar to a frame.

 I figured what makes things go wrong, but still not sure why.  I bring
 up a lightbox similar to the one 
 here:http://particletree.com/features/lightbox-gone-wild/.
 But, when I do an Ajax.Update of the lightbox div, and I have an
 onclick on a button in that lightbox.  The code attached to that
 button can longer access the global vars.

 However, if my lightbox contains a div, and I update the inner div, I
 can access the global vars from onclicks within the lightbox. At least
 that's what it seems like is happening.  There may be something else
 going on, I'm really not sure.

 -d
--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: Javascript scope

2009-02-11 Thread david

Hi doug,

Yes, give us a live demo, if possible.

But what I read let me think that you would access to a variable in
the main window from javascript coded inside a frame.
This is possible but under certain restrictions for security reasons.

Is that what you trying to do??

--
david

On 11 fév, 16:06, T.J. Crowder t...@crowdersoftware.com wrote:
 Hi,

  I wonder if a div with style overflow:auto and a scrollbar on the side
  could act similar to a frame.

 It shouldn't, no.

  But, when I do an Ajax.Update of the lightbox div, and I have an
  onclick on a button in that lightbox.  The code attached to that
  button can longer access the global vars.

 Can you post a pared-down, minimalist, self-contained page
 demonstrating the problem?  Folks here would be happy to take a
 look...
 --
 T.J. Crowder
 tj / crowder software / com
 Independent Software Engineer, consulting services available

 On Feb 11, 1:23 pm, doug douglass_da...@earthlink.net wrote:

  Thanks for the advice every one.

  T. J. Crowder,

  I wonder if a div with style overflow:auto and a scrollbar on the side
  could act similar to a frame.

  I figured what makes things go wrong, but still not sure why.  I bring
  up a lightbox similar to the one 
  here:http://particletree.com/features/lightbox-gone-wild/.
  But, when I do an Ajax.Update of the lightbox div, and I have an
  onclick on a button in that lightbox.  The code attached to that
  button can longer access the global vars.

  However, if my lightbox contains a div, and I update the inner div, I
  can access the global vars from onclicks within the lightbox. At least
  that's what it seems like is happening.  There may be something else
  going on, I'm really not sure.

  -d
--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: Javascript scope

2009-02-10 Thread joneff

Basically every set of curly braces {} gives you new scope. It does
(give you) with functions and objects, but i am not sure if it does
for for, while etc. The this is different for every level of
scope but not every scope (since it points to the current object).

Examine this code

window.ppp = ppp; // or ppp = ppp;
window.self = this; // or self = this;

// make a scope
(function(){
  // make a local var with the same name
  var ppp = qqq;
  var self = this;

  // another scope
  function alert_ppp() {
// access local
alert(ppp is:  + ppp);
alert(self is:  + self);
// access global
alert(global ppp is: window.ppp);
alert(global self is: window.self);
  }

  alert_ppp();

})();

As you can see globals are indeed available.

And though you have different scopes the this is the same (window).
However if you make and object and then have alert_ppp() be its method
you will see the local this points to this object, where as this in a
function outside an object will always point to the global window
(since they are kinda methods to the window object).

I hope that explains a little bit.

As for scope identifier -- arguments.callee would identify your
current function.

On Feb 11, 3:21 am, doug douglass_da...@earthlink.net wrote:
 I have read about Javascript and scope and I still don't really
 understand it completely, particularly when it comes to Ajax.Updater.

 I don't really understand, for example why, if there is a variable
 window.myvar, some Javascript code would not be able to access it, and
 instead it would be undefined for that code.   I was thinking
 window.myvar was global

 But, my question is, is there a way I can do some type of alert() and
 have it print out what scope it is executing in?

 thanks,
 -d

--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: Javascript scope

2009-02-10 Thread seasoup


 Basically every set of curly braces {} gives you new scope.

This is one of the most confusing aspects of javascript.  The above is
not true.  There are only two scopes in javascript, global and function
() {}

var a = 'hi';
for (var b = 0; b  10; b++) {
alert(a);  // alerts 'hi'
}

var a = 'hi';
for (var b = 0; b  10; b++) {
a = 'bye';  // alerts 'hi'
}
alert(a); // alerts 'bye'

var a = 'hi';
function foo() {
var a = 'bye';  // with a var here, javascript thinks you want the
scope local to the function.
}
alert(a); // alerts hi
foo();
alert(a); // alerts hi

var a = 'hi';
function foo() {
a = 'bye';  // without having a var here, javascript assumes you
want global scope
}
alert(a); // alerts hi
foo();
alert(a); // alerts bye


For a real good overview of scope go to jslint.com  and look through
their documentation and explanations.  Also, read the book Javascript:
The Good Parts.

~Josh Powell

--~--~-~--~~~---~--~~
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-scriptaculous@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
-~--~~~~--~~--~--~---