Conforme mencionado acima, há problemas com o uso do escopo superior em seu arquivo de script. Aqui está outro problema: O arquivo de script pode ser executado a partir de um contexto que não é o contexto global em algum ambiente de tempo de execução.
Foi proposto atribuir o global window
diretamente. Mas isso também depende do tempo de execução e não funciona no Node etc. Isso mostra que o gerenciamento de variável global portátil precisa de alguma consideração cuidadosa e esforço extra. Talvez eles consertem em futuras versões do ECMS!
Por enquanto, eu recomendaria algo assim para oferecer suporte ao gerenciamento global adequado para todos os ambientes de tempo de execução:
/**
* Exports the given object into the global context.
*/
var exportGlobal = function(name, object) {
if (typeof(global) !== "undefined") {
// Node.js
global[name] = object;
}
else if (typeof(window) !== "undefined") {
// JS with GUI (usually browser)
window[name] = object;
}
else {
throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
}
};
// export exportGlobal itself
exportGlobal("exportGlobal", exportGlobal);
// create a new global namespace
exportGlobal("someothernamespace", {});
É um pouco mais de digitação, mas torna o gerenciamento de variável global à prova de futuro.
Aviso de isenção de responsabilidade: Parte dessa ideia me ocorreu ao examinar as versões anteriores do stacktrace.js .
Acho que também se pode usar o Webpack ou outras ferramentas para obter uma detecção mais confiável e menos invasiva do ambiente de tempo de execução.