Search code examples
javascriptcoding-styleweb-worker

Should I use self or window to reference the global scope?


As a style convention I like to be explicit when I'm accessing variables in the global scope, preferring

window.example = "Hello";
window.alert(window.example);

to the less verbose

example = "Hello";
alert(example);

I now have a module which could be used directly from the browser, or, if they're available, from a web worker. In web workers the global object is called self, while in the browser it's called window.

The window object has a self property, so self.example = "Hello" would work in both contexts, so long as no-one redeclares self (as they often do: var self = this).

What's the best convention to go with?

  • Use self and hope no-one declares a conflicting self.
  • If window is defined, use window, otherwise use self.
  • Something else?

Having thought about it, I'm inclined to go with the second one.


Solution

  • In the global scope, either in the page or a web worker, you can write code like this:

    (function( global ) {
      // ... whatever
    }( this );
    

    Then inside that main outer function you can use "global" (or call it "window" or "self" or "whatever") and it'll work in either context (or in Node.js for that matter).