2012-06-25 21 views
9

javascriptの関数は、(囲まれた)リンクを囲むスコープに保持することによってクロージャを形成します。関数のクロージャにアクセスすることは可能ですか?

(可変値として)機能があるときにプログラムでアクセスすることはできますか?

実際の目標は理論的ですが、デモではクロージャのプロパティをリストすることができます。

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

//access y here with x somehow 
+0

コードサンプルはあなたの正確な問題をよりよく説明します – Blaster

+0

問題は理論的で実用的ではありません。関数を指定すると、クロージャのプロパティを列挙できますか? –

+0

'console.log(x()。y); // 5? – Blaster

答えて

4

これは、情報を非公開にする目的の1つです(クロージャの目的の1つです)。関数は既に実行されているので、スコープ変数は外部からはもはや利用できなくなりました(かつてはありません)。スコープ内で実行された関数だけがアクセスできます。

ただし、ゲッター/セッターを介してアクセスできます。

クロージャについては、Stuart Langridge's talkを参照してください。 Douglas Crockfords Explanationsもお勧めです。 )閉鎖を調べるには、いくつかのオプションがあります:Web開発者コンソールでオブジェクトを監視するか(頻繁に行うように)、ダンプするデバッグ機能を返します。すべてのプライベート変数をコンソールに追加します。

3

いいえ、あなたはそれを公開しない限りない:

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

var oldAlert = alert; 

alert = function (x) { 
    oldAlert(x); 
    window.y = x; 
} 

x(); 

console.log(y); // 5 

それとも、コードを所有している場合、あなたはスタンダールゲッターとセッターを使用することができます。

var x = function(){ 
     var y = 5; 

     return {    
      getY: function(){ 
       return y; 
      }, 
      setY: function(newY){ 
      y = newY; 
      }  
     } 
    } 


    x.setY(4); 
2

アラート機能を編集することができます。

+6

Heh、箱の外で考えてみると+1。私はOPがクロージャのすべての変数を検査できるようにしたいと思う。 – Matt

+0

私はちょうどポイントを作りたい、そのクロージャーは完全にブラックボックスではありません。 – jasssonpet

関連する問題