前述のとおり、スクリプトファイルの最上位のスコープを使用する際に問題があります。別の問題があります。スクリプトファイルは、実行時環境によってはグローバルコンテキストではないコンテキストから実行される可能性があります。
グローバルをwindow
に直接割り当てることが提案されています。しかし、それはまたランタイム依存であり、ノードなどでは機能しません。ポータブルなグローバル変数管理には、いくつかの注意深い検討と余分な努力が必要であることがわかります。将来のECMSバージョンで修正されるかもしれません!
今のところ、私はすべてのランタイム環境のために適切なグローバル経営をサポートするために、このような何かをお勧めします:
/**
* 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", {});
それはもう少しタイピングのですが、それはあなたのグローバル変数管理将来性になります。
免責事項:以前のバージョンのstacktrace.jsを見ると、このアイデアの一部が私に届きました。私は、Bowerやその他のツールを使用して、ランタイム環境のより信頼性が高く、ハックの少ない検出を行うこともできます。
この回答は正しいですが、Google Javascriptの変数スコープを使用することをお勧めします。 – aleemb
合意。私はいつも共通の "名前空間"内のすべての関数と変数をスコープして、混乱や矛盾を避けるようにしています。通常、私はそれをプロジェクトまたは会社の略奪として名付けます。 – PatrikAkerstrand
グローバル変数がグローバルスコープで作成されることを前提としており、変数の最初の言及が他のすべての言及の前にグローバルスコープ内にあることを前提としているため、 – Andrew