私の回答は、グローバル変数に関するものです。他の人も言及しているように、グローバル変数は、ページにロードするすべてのスクリプト (自分または他のライブラリ) で使用/アクセスできます。また、ブラウザで JavaScript を使用する場合、自己定義の変数/関数は「ウィンドウ」オブジェクトの下にあることに注意してください。
多くのグローバル変数/関数を作成する代わりに、アプリケーション全体のグローバル変数を 1 つ作成することもできます。その後、必要に応じて他のグローバル要素 (変数や関数をプロパティとしてこの 1 つのオブジェクトに追加することもできます) を追加できます。これをさらに進めて、特定のタスクごとにサブ プロパティを作成できます。これは、コードをきれいに保つのに役立ち、また、一種のサブグループを提供することで、コードを見ている他の人にとって理解しやすくなります。
例として
var myapp = {};
//creating a global mathmodule property under myapp that does all the math related work
myapp.mathmodule = {};
myapp.mathmodule.myvariable1 = 7;
myapp.mathmodule.myvariable2 = 3;
myapp.mathmodule.add = function() {
myapp.mathmodule.sumvalue =
myapp.mathmodule.myvariable1+myapp.mathmodule.myvariable2;
};
myapp.mathmodule.substract = function () {
myapp.mathmodule.differencevalue =
myapp.mathmodule.myvariable1 - myapp.mathmodule.myvariabl2;
};
//creating a global logmodule property under myapp that does all the logging work
myapp.logmodule ={};
myapp.logmodule.defaultmessage = "Default Values";
myapp.logmodule.logresults = function () {
console.warn('myapp.mathmodule.sumvalue:'+window.myapp.mathmodule.sumvalue);
console.warn('myapp.mathmodule.sumvalue again:'+myapp.mathmodule.sumvalue);
console.warn('myapp.mathmodule.differencevalue:'+window.myapp.mathmodule.differencevalue);
console.warn('myapp.mathmodule.differencevalue again:'+myapp.mathmodule.differencevalue);
};
myapp.logmodule.logdefaultvalues = function () {
console.log(myapp.logmodule.defaultmessage);
console.log('myapp.mathmodule.myvariable1:'+myapp.mathmodule.myvariable1);
console.log('myapp.mathmodule.myvariable2:'+myapp.mathmodule.myvariable2);
};
//次のような関数を使用できます
myapp.mathmodule.add();
myapp.mathmodule.substract();
myapp.logmodule.logresults();
myapp.logmodule.logdefaultvalues();
ファイルの先頭に var なしで新しい変数を作成することはそれほど悪くないかもしれませんが、関数内でそれを使用することは間違いなく混乱を招きます (コードを読んでいる他の人は、読み取りなしで関数からグローバル変数を作成するつもりだったかどうか確信が持てません)。私たちのコードを徹底的に)、予測できない結果につながる可能性があります。Javascript には「関数レベル」と「グローバル」の 2 つのスコープがあり、関数内で 'var' キーワードを使用しない場合、定義した変数はグローバル スコープで作成されますが、代入は関数内にある可能性があります。そのように作成された変数は、アプリケーション全体の任意のコードによってアクセス/操作できるようになりました。
即時呼び出し関数式 (IIFE) を使用して、javascript でブロック スコープをシミュレートすることができます。最近この言葉を知りました。
詳細については、http://en.wikipedia.org/wiki/Immediately-invoked_function_expressionおよびhttp://benalman.com/news/2010/11/immediately-invoked-function-expressionをご覧ください。
//if the code below followed the code at the top
//anything defined within this function is not exposed elsewhere
(function () {
var myapp = "Trying to overide the global myapp value";
console.log("Testing myapp value in an iife:",myapp);
console.log('Global myapp still accessible via window object:',window.myapp);
}());
console.log('myapp value outside of iife is the global value:',myapp);
出力は次のようになります
Testing myapp value in an iife: Trying to overide the global myapp value
Global myapp still accessible via window object: Object {mathmodule: Object, logmodule: Object}
myapp value outside of iife is the global value: Object {mathmodule: Object, logmodule: Object}