views:

122

answers:

4

I have the following function, which I use (admitedly, as a hack, since I still havent understood javascript's bizzare variable scoping rules), to fetch all global variables with a known prefix, from within a script.

The function works well with FF and Google Chrome (presumbaly it would work with all Moz derivative browsers). However, I just tested it in IE8 (aka Uncle Bill [as in Bill Gates] browser), and (perhaps unsuprisingly), the function did not work. I debugged the function and it appears that global variables are stored in another object (I could be wrong, I've only been reading on JS for a couple of days now). In any case, here is the function, which works correctly in 'Moz bazed browsers:

function getGlobalProperties(prefix) {
  var keyValues = [], global = window; // window for browser environments
  for (var prop in global) {
    if (prop.indexOf(prefix) == 0) // check the prefix
      keyValues.push(prop + "=" + global[prop]);
  }
  return keyValues.join('&'); // build the string
}

Do I need a conditional branch (and a test to see if running under IE)?

A: 

it looks like it should work, is global a keyword? try using something else or just the windows variable directly.

mythz
A: 

In IE be sure to also store your properties where you want them to be upon read.

hurikhan77
A: 

global is actually not a JavaScript reserved word.

Try this instead of what you have (commented for potential problems your code is likely running into on IE):

function getGlobalProperties(prefix) {
  var keyValues = [], global = window; // window for browser environments
  for (var prop in global) {
    if (prop.indexOf(prefix) == 0) { // check the prefix
      try {
        // this implicitly converts a window property to a string, which might fail
        keyValues.push(prop + "=" + global[prop]);
      } catch (e) {
        // in case string conversion blows up
        // do something about it here
      }
    }
  }
  return keyValues.join('&'); // build the string
}
Mike
Missing } for if
Qwerty
I don't see how this addresses the question?
AnthonyWJones
He didn't provide an error (if any) that IE is raising, so I'm making an assumption that something in IE's `window` object does not like being converted to a string.
Mike
I see, in actuality there is no error, I've tried it myself it lists other properties on the window object but not global variables.
AnthonyWJones
@AnthonyWJones: You are correct, and that was in the original question. My reading comprehension is terrible today! Should I delete my answer or do you think it adds to the conversation?
Mike
+2  A: 

It's known issue, IE does not expose global variables for for-in loop over window object (inspite that fact that accessing global variables directly like window.globalVar works). The possible workaround is to declare global variables explictly as members of window object, like:

window.globalVar = 1;
...
alert(globalVar); // = 1
globalVar = 'xxx';
alert(window.globalVar); // = xxx

By declaring variables in such way in the beginning of script you'll make them accessible for for-in loop.

The better solution of course is to avoid global vars :-) Or at least keeping all them in separate variable which you can later traverse without hacks.

Qwerty
Ok, in the end I will have to use something along the lines of what you proposed. By confirming that IE does things differently (now theres a suprise), I have written a little function to first check if being run in IE ...
Stick it to THE MAN