2011-04-05 13 views
2

は、このコードを考えます結果は次のようになります。JavaScriptのVARの可視性

  • Vが定義されていないのはなぜでは(私はそれを理解する方法 - そしてそれは右ではないかもしれませんが - 」JSで、それは、実行時ではない、定義上の関数は、それは自身の変数の持っていたように、すべての定義時だということですv "でも、最初の行でまだ定義されていません)。

  • なぜVは削除されませんか?同じ値を保持しますか?

  • 「ワンレベルアップ」から値「1」の「v」にアクセスするにはどうすればよいですか?

    "hi"関数で異なる変数名を使用すると、変数 "v"を関数の値 "1"で "見る"ことができます。だから私は元のものを隠しているのですが、それでも問題は#3です - "トップレベルのもの"にアクセスするにはどうすればいいですか?

ありがとう!

+0

'delete'はオブジェクトプロパティでのみ機能します。 – Jerry

答えて

2

You can't delete a variable like that

内部スコープのvがそれを「隠す」ため、囲みスコープからvにアクセスすることはできません。名前を変更します。これに

0

変更を:

function MyClass() { 
    this.v = '1'; 
... 

そして、あなたは常にNewでこの機能を使用してください。

は、その物がメンバーであるオブジェクトを指します。したがって、this.hiを作成すると、スコープ内の何かが関数自体と全く無関係になりますが、すべてのメンバーにthisを使用すると、それらはすべて同じオブジェクト(関数が割り当てられている)になります。 なぜ未定義の部分に関しては

http://jsfiddle.net/hHvUq/

1

は、どのようなあなたのコードがコンパイルには、次のとおりです。

function MyClass() { 
    var v = '1'; 
    this.hi = function() { 
     var v; 
     console.log('Value of V is ' + v); // undefined! 
     v = '2'; 
     console.log('Value of V is ' + v); 
     delete(v); 
     console.log('Value of V is ' + v); 
    } 
} 

あなたはvarがスコープの先頭で宣言されて見ることができるように。これがJSの仕組みです。 JSLintを通してそれを実行し、あなた自身のために見てください。