2011-12-16 7 views

答えて

4

あなたのコードは誤解を招きやすく、人々が実行命令の問題を考えるようなスタイルになっています。標準のJavaScriptエンジンは、これらの日はそれを取る前にそれを実行するに再フォーマットします:今、あなたが実際に何が起こっているか理解することができます

var a = 1, 
b = function() { 
    var a = function() {}; 
    a = 10; 
    return; 
}; 
b(); 
alert(a); 

。 "a"は関数 "b"の中で再び宣言されるので、実際には2つの "a"変数が存在します。 1つは「window.a」で、もう1つは「b var a」ですが、「b.a」ではなく、クロージャーまたは関数の外部からアクセスできないためです。

つまり、コードするものが得られます。

あなたのコードを読みやすくして、ポイントを混乱させないようにしてください。

+0

この再フォーマットされたコードを理解できました。 –

+0

だから私はあなたのコードを最初に解析されたかのように記述しなければならないという主なポイントを考えています。読みやすさが向上します。 Douglas Crockfordは学ぶ人です。 –

+0

@ emeraldcode.com私は個人的には同意しますが、コードを分解して上部の機能の「本質」を見たり読んだりすることができます。そのスタイルはJavaScript(私が考える*)が容易にしようとしているものです。個人的に私はPascalでコードを書き直したことを学びました。逆のことをしなければなりません:-) – Pointy

6

関数のシンボル "a"の最後の行を宣言します。それは代入文の影響を受ける "a"です。

関数宣言文は、関数の先頭まで持ち上げられ、最初に解釈されます。したがって、の代入文は、の後に、 "a"という名前の関数( "b"関数のローカル)を宣言した後で有効になります。したがって、代入はそのシンボルに影響し、グローバル "a"には影響しません。

変数は型付けされていないので、関数に名前をバインドしても、あとで数値に割り当てることはできません。

+0

うわー。それはjavascriptの素敵な柔軟性の素晴らしい例であり、あなたがそれを書く方法を慎重に考えていない場合には、それを得ることができます。 –

+1

はい!明らかにJavaScriptを単純に見れば、それは複雑になります:-) – Pointy

+0

申し訳ありません、Pointy、あなたは私と同じ答えをしました。私はあなたの答えに気づいていませんでしたが、わたしは分かりやすくするつもりです。あなたに+1してください。 –

関連する問題