4

私は自分のコードを最小限にするのが好きなので、ファイルの一番上で多くの変数を宣言するだけで問題ありませんか? これによりグローバルになることを理解していますか?

Global とは、その特定のファイル内のどのコードでもそれらの変数を使用できるということですか? それとも、「別の」js ファイルを持つプラグインを使用している場合、そのファイルはグローバル変数も使用でき、バグを引き起こす可能性があるということですか?

varなしで、このような変数を書くことに対するセキュリティ上の脅威はありますか

ab = $('#div32');
bc = 1000;

また、これらにも変数を使用できますか?

zy = $(window);
yy = $(document);

また、変数の後にコンマを配置すること (最後のものを除く) と、各変数の後にセミコロンを配置することの違いは何ですか? 何かに影響はありますか?

4

9 に答える 9

5

グローバル変数のスコープはプログラムに限定されているため、同じグローバル変数名を使用する他の JavaScript を取り込むと、ほぼ確実にバグが発生します。

かなり小さなものを書いている場合、すべての変数をグローバルとして宣言することは (技術的に) 確かに問題はありませんが、成長するものを書いている場合は、何らかの形式のモジュール パターンを使用して提供することが有益かもしれません。変数に別のレベルのスコープを設定し、グローバルの使用を最小限に抑えます。モジュール パターンを使用すると、通常、グローバル変数を Module 名前空間にまで減らすことができます。通常はグローバル変数であり、スコープはモジュールまでに限定されます。

于 2013-06-27T17:42:28.420 に答える
4

私の回答は、グローバル変数に関するものです。他の人も言及しているように、グローバル変数は、ページにロードするすべてのスクリプト (自分または他のライブラリ) で使用/アクセスできます。また、ブラウザで 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}
于 2013-07-04T19:59:08.067 に答える
3

これがまったく問題になる場合は、スクリプトを次のようにラップするだけです。

(function(){
   var ab = $('#div32');
   var bc = 1000;
})()

そして、それらはグローバル スコープではなく関数スコープで宣言されます。

ab = $('#div32'); と書くことによって JavaScript が遭遇する最初の ab を $('#div32'); に設定します。これはすでに宣言されているか、設定しようとするときに作成されます。これは、安定性の問題であるほどセキュリティの問題ではありません。

コンマとセミコロンに関しては、ネットワークを流れるデータの量がわずかに減少することを除けば、違いは見られません。

var foo = 1, bar = 2;

機能的には

var foo = 1;
var bar = 2;

編集: ジョーが指摘したように、私が言及すべき 3 番目のケースがあります。

var foo = 1; bar = 2;

これにより、関数スコープ内で変数 foo が設定され、グローバル スコープで変数 bar が作成/変更されます (bar が既に存在するかどうかによって異なります)。

于 2013-07-03T21:02:20.013 に答える
1

私は自分のコードを最小限にするのが好きなので、ファイルの一番上で多くの変数を宣言するだけで問題ありませんか? これによりグローバルになることを理解していますか?

それに関する唯一の問題は、カプセル化がなく、コードが少し面倒なことです。それを行うより良い方法は、以下のように必要なすべての変数を含むグローバル オブジェクトを作成することです。

それ以外の :

ab = $('#div32');
bc = 1000;

あなたが使用します:

myData = { 
  ab : $('#div32'),
  bc : 1000
}

または代わりに:

myData = {} ; // or =  new Object;
myData.ab = $('#div32');
myData.bc = 1000;

グローバル変数にアクセスするには、次のようにします。

console.log(myData.ab);

また、myDataオブジェクトは関数も保持できます。

myData.sumTwoVariable = function(a,b){return a+b;}

オブジェクト内の関数について話している素敵な記事 : Javascript オブジェクトに関数を追加するさまざまな方法

Global とは、その特定のファイル内のどのコードでもそれらの変数を使用できるということですか? それとも、「別の」js ファイルを持つプラグインを使用している場合、そのファイルはグローバル変数も使用でき、バグを引き起こす可能性があるということですか?

それらがグローバルスコープで宣言されている場合(を使用しても使用しなくてvarも、違いはありません)、はい、他のjsファイルでアクセスできます。はい、同じ変数名が他のjavascriptファイルで使用されている場合、バグや問題が発生する可能性がありますグローバルスコープも同様です。この場合、変数はオーバーライドされ、最新の影響の値が含まれます。

もっと読みたい場合は、これは素晴らしい投稿です: Javascript: さまざまな Javascript ファイルにまたがる変数のスコープ

varなしで、このような変数を書くことに対するセキュリティ上の脅威はありますか

varは、関数のスコープ内でローカル変数を指定するためにのみ使用されます。次の記事をお読みください: var キーワードの目的と、いつ使用する (または省略する)?

ab = $('#div32'); 紀元前 = 1000; また、これらにも変数を使用できますか?

はい、できます。

zy = $(ウィンドウ); yy = $(ドキュメント); また、変数の後にコンマを配置すること (最後のものを除く) と、各変数の後にセミコロンを配置することの違いは何ですか? 何かに影響はありますか?

変わりはない。これはうまくいきます:

zy = $(window); yy = $(document);

そしてこれも:

zy = $(window),  yy = $(document);
于 2013-07-05T15:42:49.327 に答える
0

最初に言っておきますが、私は必ずしも JavaScript の経験が豊富であるとは限りません。ただし、他の言語では (これは JavaScript の場合も同様であると想定しています)、これは非常に貧弱なコード プラクティスです。

変数は、機能/モジュール/クラス/などのみにスコープを設定する必要があります。それらを使用する必要があります。グローバル スコープを使用してデータを渡し続けなければならない場合は、おそらく何か問題があります。

于 2013-06-28T18:51:21.253 に答える
0

私は PJR に同意し、以下のコードも使用しています。

var myApplicationModule = {};

myApplicationModule.isIE = false;
myApplicationModule.populateErrorsData = function() {
}

これらの変数をアプリケーション全体または多くのモジュールで使用する場合は、common.js という共通の js ファイルを作成し、このコードを common.js ファイルに含めます。このコードが必要な場合はいつでも、このファイルを含めることができます。

ありがとう、クリシャン

于 2013-07-05T12:59:10.383 に答える