この例は、JavaScriptで変数と関数の名前とスコープの重要性を示しています。次のコードを考えてみましょう...
a = a();
console.log('typeof global variable a :',(typeof a));
function a() {
console.log('A');
a = function() {
console.log('B');
};
console.log('typeof global function a() inner function a() :',(typeof a));
}
console.log('typeof global function a() :',(typeof a));
a();
//=> ! TypeError: a is not a function
//=> A
//=> typeof global function a() inner function a() : function
//=> typeof global variable a : undefined
//=> typeof global function a() : undefined
何が起こっているのですか?
function a()
の内部変数a
はその型を返します。function
グローバル変数a
はfunction a()
の戻り値に設定されている - しかし、それは自動的にundefined
になるように関数が何も返しませんグローバルfunction a()
のタイプは、依然としてそれ自体の「外」の値a
によって決定されます(つまり、話す) - undefined
N console.log()
への呼び出しが到着する順序を確認しますか?
内部はvar
で設定されていないだけでなく、自動的にグローバルスコープ内に配置されますが、a = a()
はもはや機能ではありません。
a = a()
で、a is not a function
TypeErrorが発生します。一方
、私はa =
を除去するが、それはあったように他のすべてを残したときに何が起こるか見て...
a();
console.log('typeof global variable a :',(typeof a));
function a() {
console.log('A');
a = function() {
console.log('B');
};
console.log('typeof global function a() inner function a() :',(typeof a));
}
console.log('typeof global function a() :',(typeof a));
a();
//=> A
//=> typeof global function a() inner function a() : function
//=> typeof global function a() : function
//=> typeof global variable a : function
//=> B
は、順序がどのように変化したかを参照してください?
変数として 'グローバル変数a'(これまでと同じ)を考えることはできません。a
は関数を指すトークンに過ぎません。呼び出され
function a()
は、console.log(
)
を発射新しい関数に(それ自体である)トークンa
をリセットし、再度呼び出さconsole.log(
B )
を放ちます。
このようにして、より詳細な結果が得られますが、コンソールへの呼び出しは何が起こっているのかを示す大きな手がかりになります。この例を使用可能なパターンとは考えてはいけません.JavaScriptエンジンがどのように動作するかについてヒントを与えるものと考えてください。
あなたはJavaScriptIsSexy.com便利からこの記事を見つけるかもしれない:JavaScript Variable Scope and Hoisting Explained
ので、正しいものではなく、その 'return関数(){警告( 'B')}'でなければなりません。それで、本からの間違い? – xcode
はい、 'a = a()'で動くような関数を返します。私はそれを私の答えに加えます。 – nnnnnn
ありがとうございます。非常に明確で有用な答え – xcode