Jak wspomniano powyżej, występują problemy z używaniem najwyższego zakresu w pliku skryptu. Oto kolejny problem: plik skryptu może być uruchamiany z kontekstu, który nie jest kontekstem globalnym w niektórych środowiskach wykonawczych.
Zaproponowano bezpośrednie przypisanie globalnego do window
. Ale jest to również zależne od czasu wykonania i nie działa w Node itp. Pokazuje, że przenośne globalne zarządzanie zmiennymi wymaga dokładnego rozważenia i dodatkowego wysiłku. Może naprawią to w przyszłych wersjach ECMS!
Na razie polecałbym coś takiego, aby wspierać właściwe zarządzanie globalne dla wszystkich środowisk wykonawczych:
var exportGlobal = function(name, object) {
if (typeof(global) !== "undefined") {
global[name] = object;
}
else if (typeof(window) !== "undefined") {
window[name] = object;
}
else {
throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
}
};
exportGlobal("exportGlobal", exportGlobal);
exportGlobal("someothernamespace", {});
To trochę więcej pisania, ale sprawia, że globalne zarządzanie zmiennymi jest przyszłościowe.
Zastrzeżenie: Część tego pomysłu przyszła mi do głowy podczas przeglądania poprzednich wersji stacktrace.js .
Myślę, że można również użyć Webpacka lub innych narzędzi, aby uzyskać bardziej niezawodne i mniej hakerskie wykrywanie środowiska wykonawczego.