2011-10-03 17 views
5

多くのjavascriptスコープ質問が存在しますが、私の問題では正確に一致するものは見つかりませんでした。ここに私の質問のための私の現在のコードです。Javascript Scoping Confusion

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    //var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

私はこれを実行すると、予想通り、私は「ブランク」、その後「1」で警告を受けています。しかし、その行のコメントを外すと、このように見えます。

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

私は"ブランク" と警告し、その後、"ブランク" しています。これは私が期待するものではなく、行を追加すると動作が削除されることが混乱していることがわかります。誰でもここで何が起こっているのか説明できますか?私はfirefoxとsafariの両方でこの動作を見ています。

+0

を説明しました。 – jfriend00

答えて

7

すべてvarステートメントは、その囲み関数(ソート)の先頭まで効果的に "ホイスト"されます。したがって、その関数内でvar my_varどこにでもがあるということは、「my_var」のすべての言及がローカル変数を参照することを意味します。

var文の割り当て部分がシフトしていないので、私は「のようなものを」と述べた;。識別子はローカル変数である必要があり、単に宣言)

+0

docs?この例以外にこれを確認するものは何ですか? – Neal

+0

あなたの文章を完成させる。ホイスト処理は 'my_var'を関数全体のローカル変数にします。 – jfriend00

+0

この仕様はかなり明確です。セクション12.2。この仕様では、変数が「作成された」ということが述べられています。これは「巻き上げ」の部分です。 – Pointy

3

宣言が内部に掲揚されているので、理由がありますJavaScriptの関数スコープです。その詳細については、hereをご覧ください。