-2

さて、index.html と functions.js の 2 つのファイルがあります (index.html には functions.js が正しく含まれています)。

Web ページのボタンをクリックすると、関数ファイルで関数が呼び出され、Web ページの要素が (正しく) 更新され、2 つのグローバル変数の設定が試みられます ( と を実行してwindow.var1これを無効にしwindow.var2ます。これまでのところ、Web コンソールでエラーは発生していません)。 .

window.var1この関数が呼び出された後、index.html で と を読み取ろうとする JS のコードを実行しますが、window.var2両方とも null であることがわかります。

何故ですか ?解決策だけでなく、なぜこれが起こるのかについての資料を教えてください。

EDIT 私はjqueryとjquery mobileを使用しています。2 つの関数を呼び出すイベント ハンドラは次のとおりです。

 $('#map').live('pageshow',function(){
            console.debug('clicked button, calling function');
            position(longitude,latitude); //sets the global vars
            initializeMap();
            console.debug('finished with map calling');
        });

そして document.ready() の中にあります。

編集 2 2 つの関数が順番に発生することはわかっています。エントリ ポイントで console.log() を実行しています。

4

3 に答える 3

1

緯度変数と経度変数は、関数のローカル スコープで宣言されています (表示しているコードが完全なコードであると想定しています)。

グローバル スコープを適切に使用するには、これをコードの上に追加します。

var latitude = 0;
var longtitude = 0;

これで、関数が適切に機能します。ただし、グローバル変数は悪いことに注意してください。長期的にはコードを台無しにする可能性があります。モジュール設計パターンを使用することをお勧めします。

于 2013-01-17T17:14:39.650 に答える
1

完全なコードがないので、私は手足を出しています...

これらの変数を関数内で宣言および設定している可能性があります。関数スコープとは、関数が宣言されている関数の外部には存在しないことを意味します。var解決策は、(キーワードを使用して) 関数の外で (つまり、ファイルの先頭で)それらを宣言し、関数内で設定することです。

そうでなければ、それらはグローバルではありません。

これが完全に当てはまらない場合はご容赦ください。

var myGlobal = 0;

myFunction = function() {
    myGlobal = 42;
}

// myGlobal now is equal to 42

一方...

myFunction = function() {
    var myGlobal = 42;
}

// myGlobal now is null
于 2013-01-17T17:07:55.100 に答える
-2

したがって、私は通常、グローバルスコープでアクセスしたい変数に対してこれを行いますが、実際のグローバル領域を汚染することはありません:

window.PositionData = window.PositionData || {};

この行は、変数をインスタンス化するか、変数が既に存在する場合はそれ自体に等しく設定するため、上書きされません。

PositionData.var1;
PositionData.var2;

次に、値を次のように設定/取得します。

PositionData.var1 = 1;
PositionData.var2 = PositionData.var1;
于 2013-01-17T16:48:07.623 に答える