したがって、グローバル変数の作成に問題があるようです。
良い。
JavaScriptでグローバル変数を作成するのは、本来よりも簡単です。
あなたの問題はそれn
が定義されていないということです(ええと)。まだ定義されていない変数を参照することはできません。var
でも、「 ???を使ったバージョンとどう違うの?」とお考えかもしれません。そして、それは良い質問です。
JavaScriptは、変数定義の「巻き上げ」と呼ばれるものを実行します。関数内で変数を定義すると、その定義は暗黙的に関数の先頭に再配置されます。だからあなたが書いている間:
var n = n || {};
実際に起こったことは、より近いものでした。
var n;
n = n || {};
ただし、それはそれほど単純ではありません。そのコードを書き込もうとすると、n
常にに設定されてしまうから{}
です。しかし、一般的な本質はそこにあります。変数宣言は、割り当ての前に行われます。
を削除するとvar
、巻き上げる宣言がなくなるため、参照エラーが発生します。したがって、「適切な」方法の1つ(グローバル変数を作成するのは「適切」ではないため、この用語を大まかに使用します)はvar
、関数ラッパーの外に配置することです。そのようです:
var n = n || {};
(function () {
//do stuff.
}());
残念ながら、次のようにすることはできません。
var n;
(function () {
n = n || {};
}());
これには、上記の例と同じ「問題」があります。n
が他の場所で定義されている場合は、undefined
によって設定されてから、関数でvar n;
に設定さ{}
れます。関数の外部で宣言と割り当て全体を実行することにより、探しているものを取得できます。(質問のタイトルに基づいて)私が想定しているのは、実際には名前空間であり、任意のグローバル変数ではありません。それはいたずらだろう!;-)
アップデート:
ちなみに、これを行うためのより良い方法は、グローバルオブジェクトを明示的に参照することです。
(function (exports) {
exports.n = exports.n || {};
}(this));
これはおそらく、node.jsのようなものや、コードをラップする可能性のあるもの($(function() { })
)などでうまく機能します。