I’m trying to define the global object in JavaScript in a single line as follows:
var global = this.global || this;
The above statement is in the global scope. Hence in browsers the this pointer is an alias for the window object. Assuming that it’s the first line of JavaScript to be executed in the context of the current web page, the value of global will always be the same as that of the this pointer or the window object.
In CommonJS implementations, such as RingoJS and node.js the this pointer points to the current ModuleScope. However, we can access the global object through the property global defined on the ModuleScope. Hence we can access it via the this.global property.
Hence this code snippet works in all browsers and in at least RingoJS and node.js, but I have not tested other CommomJS implementations. Thus I would like to know if this code will not yield correct results when run on any other CommonJS implementation, and if so how I may fix it.
Eventually, I intend to use it in a lambda expression for my implementation independent JavaScript framework as follows (idea from jQuery):
(function (global) {
// javascript framework
})(this.global || this);
After reading Esailija and Raynos’ answers I understood that my code
this.global || thiswill not work for all cases in node.js; and that it may even fail in browsers if a variable calledglobalalready exists in the global scope.Esailija pointed out that
this.globalis not really theglobalobject, stating instead thatthisis theglobalobject in RingoJS; and although I understand his arguments, for my purposes I requirethis.globaland notthis.Raynos suggested that I hard code feature detection for every CommonJS environment. However since I’m currently only supporting RingoJS and node.js, I only need to test for
globalandwindow. Hence I decided to stick withthis.global || this.Nevertheless, as I said before
this.global || thisdoesn’t work for all cases in node.js as I understood from benvie’s comments. In the node.js REPL I realized that I requirethisand notthis.global. However,this.global || thisexpressesthis.global. In a node.js module I requirethis.globaland notthis. However, it expressesthissincethis.globalisundefined. Hence to solve this problem I finally decided to use the following code:The reason I’m using this code is because in node.js modules
this.globalisundefined. Hence we must useglobaldirectly. Thus we usetypeof global !== "undefined" && globalto get theglobalobject in both RingoJS and node.js; and we usethisas theglobalobject in browsers (window) and as a default fallback.Note: I didn’t provide any logic for finding the
globalobject in the node.js REPL because I don’t believe that my framework will be used directly within the REPL anyway. However, writing the logic to find it should be fairly trivial once one understands the complications of finding theglobalobject in node.js as benvie pointed out. I know that I don’t.