web-dev-qa-db-ja.com

JavaScript:外部から無名関数内の変数にアクセスする

この無名関数があるとしましょう:

(function(window){

 var private = 'private msg';

 function sayit() {
   alert(private) // works
 }

 document.body.onclick = sayit; // works

})(window);

// private shouldn't be accessible here

これはJavaScriptの動作ですか?

つまり、その匿名関数の外部のどこからでもprivateにアクセスする方法はありませんか?

もしそうなら、コードをそのままにして、外部からprivateにアクセスするための何らかのハックを見つけることは可能ですか?

18
steve

はい、これはJavaScriptが「プライベート」変数(関数スコープで非表示)を使用できるようにする方法です。

いいえ、コードを書き直さずにprivateなどの変数にアクセスするためのハックはありません。

関数内でvarを使用して定義された変数には、その関数内からのみアクセスできます。

13
Faiz

OK。わかった。

(function(window){
    var alert_original = window.alert;
    window.alert = function(data) {
        window.extracted = data;
        alert_original(data);
    };
})(window);

(function(window){
    var private = 'private msg';
    function sayit() {
    alert(private) // works
 }
 document.body.onclick = sayit; // works
})(window);

本文をクリックすると、extractedから「プライベートメッセージ」を取得できます

8

これらは「プライベート」変数として意図されたものではありません。これが、クロージャーが機能する方法です。少なくとも、PerlとPythonでは同じことができますが、おそらくクロージャーと字句スコープを備えた他の多くの言語でも同じことが言えます。

FirebugやChrome Inspectorなどのデバッガーは、いつでもスタック全体を表示できます(クローズドオーバー変数を含む)が、それ以外は、元のコードを変更せずに、運の。

多分あなたが私たちにあなたの実際の問題を言ったなら... :)

2
Eevee

これがスコープとプライベート変数を持つことの要点です

どちらか

プライベート値をグローバル変数に設定しますか?

または

外部で変数を宣言する

0
gurvinder372