2016-12-20 26 views
1

コンパイラが関数を検索してからグローバルスコープ内で変数bを検索するため、以下の関数はb is not definedを返します。JavaScriptのグローバル変数、変数なしで定義された変数

しかし、単語varのないbを定義すると自動的にグローバル変数が作成されると仮定しましたか?

varという単語を省略すると誰もルールを説明できますか?

function foo(a) {  
    console.log(a + b);  
    b = a; 
} 

foo(2); 
+1

それが定義されていないので、そこ 'console.log' Bです。 – Mahi

+1

そうですが、定義する前に変数 'b'を使用しようとしていますが、' b = a; 'の後にconsole.logを移動すると4 – Stu

答えて

4

それがグローバルに変数宣言のための機能でvarをん使用して、しかし、あなたの場合には、JavaScriptエンジンは、このライン当たっていない:それは、この行を打つ前に

console.log(a + b); 

を:

b = a; 

そして、それはそれを(グローバルに)宣言する行です。

そして、あなたはvarを使用していないので、宣言は、それがvarであったであろうコードベースの上(に掲揚されていない - あなたはまだbの値を得なかったであろう唯一の宣言になるためホイスト、初期化ではなく、それはエラーを投げていないだろう)、あなたはあなたのエラーを取得します。

varと吊り上げについてhereを参照してください。 strictモードで

1

:宣言されていない変数を使用して

  • は非strictモードでは例外

がスローされます。宣言されていない変数に代入

  • は、グローバルを作成し、これはではなく、が吊り下げられた
      で変数を宣言
    • は、ローカル変数を作成し、は、あなたがしていないので、例外

    がスローされます宣言されていない変数を読み込む機能

  • の先頭にを掲揚されます厳密なモードで、の前にbを読み込もうとすると、例外が発生します。

    • 常に"use strict"
    • 常にあなたがそこにそれら
    • をしたい場合は、グローバルスコープでそれらを宣言し...しかし、グローバルスコープを回避しようと、あなたの変数
    • を宣言:

      ガイドラインに従うためには、


      。あなたがグローバルが役に立つと思うならば、代わりにクロージャを使うことを考えてみましょう。
  • 0

    このように宣言された変数b = aは、varキーワードで宣言された変数のようにホイストされません。これは、実行時に、コンパイラはbを未定義ではなく(var b = aと同じように)読み込みますが、まったく存在しないので、ReferenceErrorをスローします。

    は、巻き上げの情報:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

    関連する問題