Wednesday, June 24, 2009

Where did my global variable go?

Came accross this problem the other day - thanks to David! Wanted to test if the javascript variable had already been defined (globally) and supply a default value if it wasn't defined.

  var name = "Rob";

  function testScope() {
    document.write("<p>Before IF. My name is " + name + "</p>");
    if (!name) {
      var name = "Rob2";
    }
    document.write("<p>After IF. My name is " + name + "</p>");
  }

  document.write("<p>Before testScope(). My name is " + name + "</p>");
  testScope();
  document.write("<p>After testScope(). My name is " + name + "</p>");

Here is the result.

   Before testScope(). My name is Rob

   Before IF. My name is undefined

   After IF. My name is Rob2
 
   After testScope(). My name is Rob

Unfortunately, simply declaring the var again (var name = "Rob2";) created a locally scoped version of the var for the entire function - even though I only declared it within the IF. The fix was easy: just remove the var.

  var name = "Rob";

  function testScope() {
    document.write("<p>Before IF. My name is " + name + "</p>");
    if (!name) {
      name = "Rob2";  // No var!
    }
    document.write("<p>After IF. My name is " + name + "</p>");
  }

  document.write("<p>Before testScope(). My name is " + name + "</p>");
  testScope();
  document.write("<p>After testScope(). My name is " + name + "</p>");

Here is the result.

   Before testScope(). My name is Rob

   Before IF. My name is Rob

   After IF. My name is Rob

   After testScope(). My name is Rob

It had a value all along!

Remember that global variables belong to the window object, thus the following would also have worked.

  if (!window.name) {
    window.name = "Rob3";
  }