2016-08-15 11 views
3

次のコードでは、なぜ変数x.bにアクセスできますか?ローカルスコープを持つべきではありませんか?JavaScript関数の可変スコープ

CODE

function x() { 
    var a = 3; 
} 


x.b = 8; 

console.log(x.a); 
console.log(x.b); 

OUTPUT

undefined 
8 
+0

私は、あなたがアクセス可能なオブジェクトであり、新しいプロパティ "b"を与えただけだと思います。 –

+1

'x'と' x.b'の両方がグローバルスコープで定義されました。では、なぜ彼らに「ローカルスコープ」があると思いますか? – str

+1

いくつかの基本的な誤解があるようです。ドット表記法はローカル変数にアクセスしません。 –

答えて

3

あなたはxのコンストラクタ内aを宣言するvarを使用すると、aはあなたがx.bを行うときしかしあなたは、プライベートとしてマークされます本質的に言って - プロパティbをオブジェクトに追加するx。したがって

あなたが技術的にあなたが8

+0

しかし、 'x'はここのコンストラクタではなく、そのコンストラクタとしても使われていません。それは単純な古い関数です。 –

+0

@トラザブロ正しい。 'x'は単なる古い関数です。私は最後のどこかで 'new'キーワードを見たと思っていました...うーん、私は疲れているはずです:( –

0

あなたは8にx.bを定義して、それがグローバルVARとなっているオブジェクトxのプロパティbに、アクセスしているx.bを話すん。つまりどこからでもアクセスできます。

したがって、x()は独自のスコープを持つ関数です。したがって、上記の方法で関数スコープ内の変数にアクセスすることはできません。しかし、これを実行してx関数を呼び出すことで、 'a'にアクセスすることができます。

function x() { 
    var a = 3; 
    return a; 
} 
+1

' x.b'は**グローバルではありません** 'x'というオブジェクトのプロパティです。 –

0

Javascriptがグローバルオブジェクトとしてx.b見なします。

x.b = 8; 
function x() { 
    var a = 3; 
    alert(x.b) 
} 
x(); 
console.log(x.a); 
console.log(x.b); 

しかし、関数宣言の前に必ずx.bを指定してください。

オブジェクトaは関数x()の中で指定されているため、非公開にしていますが、なぜconsole.log(x.a)の結果が未定義になっていますか?

あなたはこのようにそれを書いた場合:

a = 5; 
function x() { 
    var a = 3; 
} 
x.b = 8; 

alert(a); 
alert(x.b); 

あなたが怒鳴るような結果が得られます:

5 
8 

javascriptのAとX.Aのための2つの別々のオブジェクトです。