グローバル変数はどの時点で次の関数で作成されますか? test()が実行される前か後に?Javascript:グローバルはいつ作成されますか
var test = function(){
foo = 5
}
test()
編集:私は
グローバル変数はどの時点で次の関数で作成されますか? test()が実行される前か後に?Javascript:グローバルはいつ作成されますか
var test = function(){
foo = 5
}
test()
編集:私は
..before
test()
が後に実行されるか、変数fooへの参照ですか?
それはあなたが、test
またはfoo
に言及していたグローバル変数によって決まります。
test
の場合:前。 var
の宣言は "吊り上げられ"、表示されたスコープ内のステップバイステップコードが実行される前に処理されます。グローバルスクリプトは、そのスクリプトのグローバルスコープでステップバイステップコードより前に実行されます。 (後続のスクリプトは個別に処理され、最初の変数、ステップバイステップコード)
foo
の場合:
そのコードの順序は次のとおり
test
が値undefined
で作成されています。test = function() { foo = 5 }
test
test()
に割り当てられて実行されます
foo = 5
は(私のブログの詳細:The Horror of Implicit Globals)foo
と呼ば暗黙のグローバルを作成し、実行されるインタプリタが割り当てしようとしたときに、変数foo
が作成されます変数foo
は、関数の実行中に変更されます。
var test = function(){
foo = 5
}
window.hasOwnProperty('foo'); // false
test()
window.hasOwnProperty('foo'); // true
これはテストに十分に簡単です:ここでは、あなたのコード内で
// 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);
'console.log(typeof foo)'を使って、作成されているかどうかを知ることができます(前に ''未定義 ''となります)。また 'this.hasOwnProperty(" foo ")'(または 'window.hasOwnProperty(" foo ")')です。 –
@ T.J.Crowderはい、私は2つの理由でこの方法を示しました。 1)エラーを得ることは、変数が作成されていないという確かな証拠であり、2)実行するのが最も簡単なテストです。 –
* "エラーが発生しても、変数が作成されていないという確かな証拠です" * :-D True! –
var test = function(){ foo = 5};
test();
テストはFunctionオブジェクトを保持するグローバル変数です。これは、グローバル実行環境中にtest()関数が呼び出される前に作成されます。
fooもvar、letまたはconstキーワードが存在しないため、グローバル変数です。しかし、test()関数の呼び出し後に作成されます。
'foo'はローカル変数ではありません。グローバル変数で、' test() 'が復帰した後も持続します。例については、私のコードスニペットを参照してください。 –
@scottは正しいです、私はvar、letまたはconstキーワードがないことを見落としました –
@RafiqueAhmedあなたが "見落とされた"かなり巨大なもの - それは質問でした... – Li357
あなたが 'test'や' foo'について興味があるかどうかを知ることができれば役に立ちます。 – Pointy
@Pointy、私は彼が 'foo'について尋ねると思うのですが、それは' var'なしで作成され、グローバルになるように設計されているからです。 –
実際に言うとまだ良いです。 –