Získejte globální proměnné pomocí JavaScriptu

Aktualizováno 1. 9. 2015:Moje původní metoda, keys(window) dával neužitečné výsledky v jiných prohlížečích než Chrome. Tento příspěvek jsem aktualizoval spolehlivější metodou.

Globaly JavaScriptu jsou považovány za špatné. A jako přispěvatel do projektu MooTools to slýchám denně po většinu desetiletí. MooTools dostaly úder za rozšíření nativních prvků, ale také za umístění objektů do globálního prostoru, jako je Browser a $$ . Filozofie „globální proměnné jsou hrozné“ mi připadá trochu legrační, protože dokonce i zavaděče jQuery a JavaScriptu používají globální proměnnou.

Necháme-li stranou záměrné globální proměnné, únik globálních proměnných je špatný postup a je výsledkem nedbalého kódování. Jak tedy můžeme zjistit, jaké vlastnosti jsou vlastní v rámci globálního jmenného prostoru? Je to jednodušší, než si myslíte:

// 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);
})();

Uvidíte tam některé proměnné, o kterých víte, že jste je nenastavili, například window , document , top a location , ale ostatní budou prozrazeny (nebo úmyslně) globálními hodnotami nastavenými vlastním kódem JavaScript!