2017-11-02 4 views
0

JavaScriptのvarを使用して変数の範囲を理解していないので、その変数への参照が見つかるまで範囲内に入り、グローバルスコープに当たると変数を作成します。コールバック関数内でvarで宣言されていない変数の再割り当て

私の質問は、このコードでは、これの出力は0 0 1ですが、私のロジックがどこまでうまくいかないのか分かりません。

私の頭が最初に見つかったのは0であると宣言されています。そして、varで宣言されていないので、スコープが上がるにつれてグローバル変数になります。現在見つかっているのは0です。

最初のif文の後に出力されます。したがって、0になっています。

次に、getMyLocation関数のコールバック関数の外側に見つかるまで、見つかったスコープがスコープに上がることはありません。

次に、1を印刷してからコードブロックの外に出たら、再び1を印刷して0 1を得ると仮定します。私が間違っていると理解しています。

<script> 
 
function getMyLocation() { 
 
    found = 0; 
 
    if (navigator.geolocation) { 
 
     console.log(found); 
 
     navigator.geolocation.getCurrentPosition(function(position) { 
 
      found = 1; 
 
      console.log(found); 
 
     }); 
 
    } 
 
console.log(found); 
 
} 
 
</script>

+0

* var *(または* let *または* const *)のない変数を初期化することは**宣言していません**。 ;-) – RobG

+1

'navigator.geolocation.getCurrentPosition()'に渡された関数は、結果を非同期的に – guest271314

+0

@ guest271314返しますが、その関数内で見つかったconsole.logは、その関数内で1に設定されたコールバックではありません。 – Malcolm

答えて

0

何が起こっているかの内訳です:

  • 最初にconsole.log()であるとして "見つかった" の値を出力します。印刷:0

  • navigator.geolocation.getCurrentPosition()を呼び出すと、最初の引数として成功ハンドラ関数が必要です。この関数に渡す関数は、非同期的に、つまり応答があるときはいつでも呼び出されます。まだここには何も印刷されていません。

  • "found"の値がまだ0(まだ前のステージからの応答なし)である3番目のconsole.log()文が表示されます。印刷:0

  • 非同期呼び出しはステージ2から解決し、 "found"の値を1に更新してから印刷します。プリント:1

だから、全体の出力は0 0 1

PSです:通常、悪い考えはそれらを宣言せずに変数を使用すると「厳格な使用」場合は動作しませんと考えられていますがで存在し、ページの上部。

0

を参照してください、JSがシングルスレッドです。したがって、それはイベントループ(video which explains what is event loop)によって非同期としてタスクを管理しています。 getCurrentPositionのコールバックを与えています。だから、私はそれが非同期関数だと思います。 3つ目のコンソールの後に実行されます。だから、あなたは命令と混同されます。私はあなたのコードの順序を明確にしました。それが、ここで何が起こるかを理解するのに役立つと思います。この問題はスコープでは発生しません。ここで

<script> 
 
function getMyLocation() { 
 
    found = 0; 
 
    if (navigator.geolocation) { 
 
     console.log(found); // order ::: 1 
 
     navigator.geolocation.getCurrentPosition(function(position) { 
 
      found = 1; 
 
      console.log(found); // order ::: 3 
 
     }); 
 
    } 
 
console.log(found); // order ::: 2 
 
} 
 
</script>

関連する問題