3

私は自分が正しいことをしているのか間違っているのかわかりません。私の理解ははっきりしていません。私はいつもたくさんの外部jsファイルを作成していて、それらすべてをヘッダーに入れています。私のすべての外部jsファイルは次のように同じように始まります:

$(document).ready(function(){
  //all the functions and variables
});

たとえば、3つの外部jsファイルがある場合:

1.1。

$(document).ready(function(){
  var a = 1000;
  function run(){alert(a)};
  $('#btna').click(function(){run();});
});

2.2。

$(document).ready(function(){
  var b = 2000;
  function run(){alert(b)};
  $('#btnb').click(function(){run();});
});

3.3。

他のJSファイルにある変数や関数を使用しようとしたことはありません。a3番目のJSファイルでとb変数を取得することは可能ですか?

$(document).ready(function(){
  //is it possiblr to do this?
  alert(a+b);
  //or if I use run(), which methods will be called?
  run();
});

私はとても混乱しています...外部JSは実際にどのようにhtmlにロードされますか?または、すべてのファイルにドキュメントを用意するべきではありませんか?ここで、たくさんのものを同時にロードするのではなく、スクリプトが完全にロードされた後に1つずつロードしたいと思います。したがって、最初にそれを明確にする必要があります。

4

5 に答える 5

2

変数をグローバルスコープに入れ始めないでください。これは必要な場合もありますが、http://requirejs.orgなどを使用して異なるスコープ間でモジュールを共有する方がはるかに優れています。モジュールとオブジェクトを使用することで、変数のスコープを制限し、同じスコープを持つ異なるファイルで定義された変数間の競合によるエラーの可能性を減らします。RequireJS はまた、依存関係を管理し、JavaScript ファイルを非同期的にロードし、必要に応じてスクリプトを最適化するクリーンな方法を提供します。

学習の観点から、他の人が指摘しているように、観察している困難は、変数のスコープがドキュメントの準備ができているときに実行される無名関数に対してローカルであるためです。で定義された JavaScript 変数varは、含まれているコード ブロックに対してローカルなスコープを持ちます。を使用して変数を定義しない場合varその後、グローバルにスコープされます。複数の場所で変数を誤って再利用する可能性を減らすために、グローバル スコープの使用は避ける必要があります。経験則として、スコープを可能な限り制限し、それが使用される場所にローカルに定義することをお勧めします。変数をグローバルに共有する必要がある場合は、おそらくそれをオブジェクトのプロパティとして定義し、オブジェクトをグローバルに共有する必要があります。オブジェクトはグローバルに共有されますが、オブジェクト コンテキストは変数のスコープとして (名前空間のように) 機能するため、別の目的で別の場所で誤って再利用する可能性が低くなります。

例えば:

<script type="text/javascript">
     var globalConstants = {
          a = 5,
          b = 10
     };
</script>

globalConstants.aその後、後でorを参照できます。これにより、実際には同じ変数であることを知らずに、別のスクリプトでorglobalConstants.bを誤って使用する可能性が低くなります。ab

于 2012-11-25T05:51:05.590 に答える
0

含める最初のファイルの $(document).ready の上で、変数をグローバルにします

var a;
var b;

JavaScript を個別にロードするか、1 つのファイルとしてロードするかは、javascript に違いはありませんが、通常、頻繁に使用されるスクリプトは、ロードするのではなく、1 つの js ファイルに入れることをお勧めします。

ここで、スクリプトが完全にロードされた後、スクリプトを 1 つずつロードし、多数のものを同時にロードしないようにしたいと考えています。

...より多くの読み込みを行っているため、おそらく遅くなるでしょう。

于 2012-11-25T05:28:57.043 に答える
0

各ファイルは別々です [それらの存在を知らない] ためdocument.ready、スクリプトでドキュメントの準備が必要な場合は、各ファイルに が必要になります。

頭ではなく、本文の最後にスクリプトを含めることをお勧めします。この質問をチェックしてください: body タグの終了前に jQuery/javascript ソースページを配置する

楽しいのはあなたの例です。変数はローカルにスコープされているため、エラーが発生します。ローカル スコープのため、変数ab、およびrunは 3 番目のファイルでは未定義になります。

于 2012-11-25T05:24:08.410 に答える
0

js コードを別のファイルに入れても違いはありません。これら 3 つのファイルの結果は、このコードを含む単一のファイルになると考えることができます。

$(document).ready(function(){
 var a = 1000;
 function run(){alert(a)};
 $('#btna').click(function(){run();});
});

 $(document).ready(function(){
     var b = 2000;
     function run(){alert(b)};
     $('#btnb').click(function(){run();});
    });

 $(document).ready(function(){
       //is it possiblr to do this?
    alert(a+b); 
       //or if I use run(), which methods will be called?
    run();
 });

しかし、3 番目のスニペットでa+bは、別のファイルではなく、abが異なる関数で定義されているため、そうすることができません。JS には関数スコープがあります。関数が終了するとすぐに、変数は破棄されます。

使用したい場合はa+b、それらをグローバルにします(それらから除外することによりvar

例えば ​​の代わりvar a = 1000a=1000

于 2012-11-25T05:32:27.940 に答える
0

最初に宣言された Javascript ファイルで、popnoodles が提案することを行います。

別の方法として、他の js ファイルがインクルードされる前に以下を追加することもできます。

<script>
 var a;
 var b;
</script>

グローバル変数は、先に進む JavaScript ファイルで使用できるように、先頭で宣言する必要があります。

于 2012-11-25T05:33:50.997 に答える