2013-05-28 5 views

答えて

6

可変ホイストのため、次のように解釈されます。 @ShadowCreeperが正しく指摘しているように、function a(){}は実際には、関数bの内部にローカル変数aを作成しています。この変数は、以下に示すように吊り上げられています。

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1は 'ホイスト 'に言及しています。 – sabithpocker

+0

' a'を 'b 'の内部の関数として定義しています。暗黙のローカルスコープの背後にある魔法は何ですか? – sabithpocker

+0

+1良い例 – John

2

ローカル変数(関数a)、その後10とそのローカル変数の値(function)の交換を作成しているので。

このようなことを避ける方法の1つは、すべてのローカル変数と関数の前に "_"(アンダースコア)を付けることです。

+0

これは十分ではないことがわかります。私はdownvote、fwiwをしませんでした。 – xandercoded

+2

'var' = 10;を 'b'関数の先頭に置くと、グローバルを隠すローカル変数があります。 'function a()'は 'var a = function()'( 'a'という名前のローカル変数を'関数 'として作成する)と同じように動作します。 –

+0

が合意したところで、ネストされた 'function a'の暗黙的なローカル宣言はキッカーhttp://jsfiddle.net/AVcqr/です... – xandercoded

2

This answerはここで何が起こっているのか本当にいい説明があります。

概要は、Javascriptがコンパイルと実行の2つのフェーズで処理されることです。関数定義はコンパイルステップ中に発生するため、bの内部でコンパイラはfunction a() {}の定義を参照し、ローカル変数abのスコープ内で作成されます。あとでコードを実行すると、コードが実行される前にbのスコープにローカル変数aが含まれているので、ローカル変数に新しい値を与えるだけです。コンパイル中に関数定義がすでに処理されているため、実行中には発生しません。console.log(a)10を出力します。

関連する問題