2011-09-17 10 views
0

子スコープ内のプライベート変数を、親スコープの同じ名前のプライベート変数の値に設定できますか?親スコープから同じ名前の変数の値にプライベート変数を割り当てる

は、次のことを考えてみましょう:

var foo = 10; 

function bar() { 
    var f = foo, foo = f; 
    return foo; 
} 

bar() // Returns 10 

は、これはプレースホルダ変数fを使用せずに行うことができますか?

var foo = 10; 

function bar() { 
    var foo = foo; 
    return foo; 
} 

bar() // Want 10 but returns undefined. 

私はbarに引数を渡しません。私はこれが美学以外の理由では重要ではないことを認識しています。

+0

なぜ私はこの問題に対する解決策を望んでいるのでしょうか?具体的に何かしようとしていますか? –

答えて

1

同じ名前のローカル変数があるため、グローバル変数は表示されません。つまり、ローカル変数はグローバル変数を非表示にします。

var foo = foo; 

fooの宣言のみ;に達した後に終了します。しかし、fooからfoo自身を初期化しようとすると、宣言の終点に達していないため、未定義です。

0

はい、親スコープからfooを明示的に参照する必要があります。通常はthisになりますが、関数がapplyまたはcallで呼び出された場合は注意が必要です。これは、例えば、動作するはずです:

var foo = 10; 

function bar() { 
    var foo = this.foo; 
    return foo; 
} 

bar(); // 10 

編集:私は@Felix」はコメントごとに、補正を行う必要があります。 thisは実際には通常、親スコープではなくグローバルスコープを参照します。たとえば、次のように考えてみてください。

var x = 'global'; 
(function() { 
    var x = 'inner'; 
    (function() { 
     var x = this.x; 
     console.log(x); // 'global' 
    })(); 
})(); 
+1

この場合にはうまくいくかもしれませんが、一般に、このように関数を呼び出すとき、 'this'はグローバルスコープではなくグローバルスコープです。 –

+0

「this」がバインドされるイベントハンドラ内では、いいえ? –

+1

@Felix - 良い点。その時点で修正されて更新されました。いずれにしても、これはおそらく愚かなやり方です。私は、一部のコンテキストでは、この動作を一時変数を使用して取得できることを実証しようとしていました。 – jmar777

関連する問題