2017-01-09 5 views
-2

グローバル変数はどの時点で次の関数で作成されますか? test()が実行される前か後に?Javascript:グローバルはいつ作成されますか

var test = function(){ 
    foo = 5 
} 

test() 

編集:私は

+1

あなたが 'test'や' foo'について興味があるかどうかを知ることができれば役に立ちます。 – Pointy

+0

@Pointy、私は彼が 'foo'について尋ねると思うのですが、それは' var'なしで作成され、グローバルになるように設計されているからです。 –

+0

実際に言うとまだ良いです。 –

答えて

3

..before test()が後に実行されるか、変数fooへの参照ですか?

それはあなたが、testまたはfooに言及していたグローバル変数によって決まります。

testの場合:前。 varの宣言は "吊り上げられ"、表示されたスコープ内のステップバイステップコードが実行される前に処理されます。グローバルスクリプトは、そのスクリプトのグローバルスコープでステップバイステップコードより前に実行されます。 (後続のスクリプトは個別に処理され、最初の変数、ステップバイステップコード)

fooの場合:

そのコードの順序は次のとおり

  1. 宣言が発生する:
    1. グローバルtestが値undefinedで作成されています。
    2. ステップ・バイ・ステップ実行が行われ
    1. 割り当てtest = function() { foo = 5 }
      1. を実行する機能が
      2. 作成されたそれは、test
    2. test()に割り当てられて実行されます
      1. 割り当てfoo = 5は(私のブログの詳細:The Horror of Implicit Globalsfooと呼ば暗黙のグローバルを作成し、実行されるインタプリタが割り当てしようとしたときに、変数fooが作成されます
2

変数fooは、関数の実行中に変更されます。

var test = function(){ 
    foo = 5 
} 

window.hasOwnProperty('foo'); // false 

test() 

window.hasOwnProperty('foo'); // true 
2

これはテストに十分に簡単です:ここでは、あなたのコード内で

// The code within the function won't be evaluated (nor any variables within it be hoisted) 
 
// until that code is invoked 
 
var test = function(){ 
 
    foo = 5; 
 
} 
 

 
// This will fail saying that foo is undefined, so we know that the global 
 
// hasn't been created yet 
 
//console.log(foo); 
 

 
// Call the function and force the code within it to be evaluated 
 
test() 
 

 
// Works. The global has been created.. 
 
console.log(foo);

+1

'console.log(typeof foo)'を使って、作成されているかどうかを知ることができます(前に ''未定義 ''となります)。また 'this.hasOwnProperty(" foo ")'(または 'window.hasOwnProperty(" foo ")')です。 –

+0

@ T.J.Crowderはい、私は2つの理由でこの方法を示しました。 1)エラーを得ることは、変数が作成されていないという確かな証拠であり、2)実行するのが最も簡単なテストです。 –

+0

* "エラーが発生しても、変数が作成されていないという確かな証拠です" * :-D True! –

0

var test = function(){ foo = 5}; 
    test(); 

テストはFunctionオブジェクトを保持するグローバル変数です。これは、グローバル実行環境中にtest()関数が呼び出される前に作成されます。

fooもvar、letまたはconstキーワードが存在しないため、グローバル変数です。しかし、test()関数の呼び出し後に作成されます。

+0

'foo'はローカル変数ではありません。グローバル変数で、' test() 'が復帰した後も持続します。例については、私のコードスニペットを参照してください。 –

+0

@scottは正しいです、私はvar、letまたはconstキーワードがないことを見落としました –

+1

@RafiqueAhmedあなたが "見落とされた"かなり巨大なもの - それは質問でした... – Li357

関連する問題