2016-04-26 22 views
2

ローカルスコープに問題があります。 2番目のconsole.logは "a"値を表示しませんが、未定義を示します。なぜそうなのか?ローカルスコープがグローバル変数を参照しないのはなぜですか?

"use strict" 

console.log(a); //undefined 
var a = "a"; 
function b(){ 
    console.log(a); // why is undefined here? 
    var a = "a1"; 
    console.log(a); // here is "a1" 
} 
b(); 
+0

に二 'var'を削除これは、あなたがそれを実行しているときにどのように見えるかです_redeclare_ itではなく、グローバル 'var a'に値を割り当てます。 –

+0

var aは関数内でもグローバルスコープです。なぜなら、あなたは両方とも宣言しています。 – nisar

+0

あなたの兄弟と友人の両方が「ボブ」と命名されている場合は、両方で車に乗ることに特化する必要があります。 – dandavis

答えて

1

オブジェクト指向のJavaScript、第2版:あなたのJavaScriptプログラムの実行が新しい関数を入力すると、すべての変数がどこかの関数では に移動(または上昇、または掲揚)されている を宣言関数の先頭。これは、留意する重要な概念です。 さらに、宣言だけが呼び出され、 の存在が上に移動することを意味します。どの課題も、どこにいても残っています。 上記の例では、ローカル変数aの宣言は、 が先頭に巻き込まれました。

var a = 123; 

function f() { 

    var a; // same as: var a = undefined; 

    alert(a); // undefined 

    a = 1; 

    alert(a); // 1 
} 
3

JSは次のようにコードを処理します:

"use strict" 

var a; // undefined 
console.log(a); //undefined 

a = "a"; 

function b(){ 
    var a; // undefined 

    console.log(a); // all is clear, LOCAL variable a is undefined. 

    a = "a1"; 
    console.log(a); // here is "a1" 
} 

b(); 

hereを巻き上げについての詳細を読みます。

また、Function declaration hoistingについて読むことができます。これはJavaScriptの基本的な部分の重要な部分です。

0

ホイストは、宣言を先頭に移動するJavaScriptのデフォルト動作です。機能範囲にaという変数があります。あなたが関数bで定義されている別の変数を持っているので、それはこのようなので

"use strict" 

console.log(a); //undefined 
var a = "a"; 
function b(){ 
    var a; 
    console.log(a); // Undefined because a is not set 
    a = "a1"; 
    console.log(a); // here is "a1" 
} 
b(); 
0

を::

function b() { 
    var a; 
    console.log(a); 
    a = "a1"; 
    console.log(a); 
} 
関連する問題