コンストラクタaが呼び出されたときに 'a'の値がグローバルスコープを失うように見えます。JavaScriptスコープが変更されますか?なぜこれが起こるのですか?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
コンストラクタaが呼び出されたときに 'a'の値がグローバルスコープを失うように見えます。JavaScriptスコープが変更されますか?なぜこれが起こるのですか?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //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
ローカル変数(関数a
)、その後10
とそのローカル変数の値(function
)の交換を作成しているので。
このようなことを避ける方法の1つは、すべてのローカル変数と関数の前に "_"(アンダースコア)を付けることです。
これは十分ではないことがわかります。私はdownvote、fwiwをしませんでした。 – xandercoded
'var' = 10;を 'b'関数の先頭に置くと、グローバルを隠すローカル変数があります。 'function a()'は 'var a = function()'( 'a'という名前のローカル変数を'関数 'として作成する)と同じように動作します。 –
が合意したところで、ネストされた 'function a'の暗黙的なローカル宣言はキッカーhttp://jsfiddle.net/AVcqr/です... – xandercoded
This answerはここで何が起こっているのか本当にいい説明があります。
概要は、Javascriptがコンパイルと実行の2つのフェーズで処理されることです。関数定義はコンパイルステップ中に発生するため、b
の内部でコンパイラはfunction a() {}
の定義を参照し、ローカル変数a
はb
のスコープ内で作成されます。あとでコードを実行すると、コードが実行される前にb
のスコープにローカル変数a
が含まれているので、ローカル変数に新しい値を与えるだけです。コンパイル中に関数定義がすでに処理されているため、実行中には発生しません。console.log(a)
は10
を出力します。
+1は 'ホイスト 'に言及しています。 – sabithpocker
' a'を 'b 'の内部の関数として定義しています。暗黙のローカルスコープの背後にある魔法は何ですか? – sabithpocker
+1良い例 – John