Get Global Variables with JavaScript
Updated 9/1/2015: My original method, keys(window)
gave unhelpful results in browsers other than Chrome. I've updated this post with a more reliable method.
JavaScript globals are considered bad. And as a contributor to the MooTools project, I've heard this on a daily basis for the better part of a decade. MooTools got knocked for extending natives but also for placing objects in the global space, like Browser
and $$
. I find the "global vars are terrible" philosophy a bit funny since even jQuery and JavaScript loaders use a global variable.
Intentional globals aside, leaking global variables is bad practice and a result of sloppy coding. So how can we see what properties are custom within the global namespace? It's easier than you think:
// UPDATE: This method is too naive // Returns an array of window property names //keys(window); // Inject an iframe and compare its `contentWindow` properties to the global window properties (function() { var iframe = document.createElement('iframe'); iframe.onload = function() { var iframeKeys = Object.keys(iframe.contentWindow); Object.keys(window).forEach(function(key) { if(!(key in iframeKeys)) { console.log(key); } }); }; iframe.src = 'about:blank'; document.body.appendChild(iframe); })();
You will see some variables there that you know you didn't set, like window
, document
, top
, and location
, but the others will have been leaked (or intentional) globals set by custom JavaScript code!
GoogleAnalyticsObject :)
Am I missing something? All I get is:
In what browser/OS?
http://caniuse.com/#search=keys
You may also use:
Firefox 40.0.3 and windows 7 do not knows keys: keys is not defined
keys
is a console command for Chrome. It should be equivalent toObject.keys
, though.But, overall, if you don’t want your variables to be leaked, the best recommendation is to use strict mode.
Firefox returns an array of 186 items and Chrome returns an array of 23 items. I think more standardization work is needed.
All: I’ve updated with a more helpful method!
Oh, that’s actually nice.
I suggest removing the iframe from the document after logging the differences.
key in iframeKeys
may be wrong,iframeKeys.indexOf(key) > -1
works fineSo, that is the best option to not use a global variable ?
This seems to work better:
Just an ever-so-slight improvement on Valterri’s concise suggestion:
Is there supposed to be an iframe somewhere automatically, or does it have to be triggered?