23

私がこの無名関数を持っているとしましょう:

(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もしそうなら、コードをそのままにして、外部からアクセスするためのある種のハックを見つけることは可能ですか?

4

5 に答える 5

14

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

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

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

于 2013-01-17T06:45:44.520 に答える
10

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

于 2013-01-17T07:02:18.100 に答える
2

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

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

おそらくあなたがあなたの実際の問題を私たちに話したなら...:)

于 2013-01-17T07:12:27.483 に答える
0

それがスコープとプライベート変数を持つことの全体的なポイントです

また

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

また

変数を外部で宣言する

于 2013-01-17T06:50:54.303 に答える
-3

あなたはこのようなことをしなければならないでしょう:

var Test = (function(window){
 var private = 'private msg';
 var api = {};

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

api.sayit = sayit;
return api;
})(window);

Test.sayit(); //this would alert 'private msg'
于 2013-01-17T06:49:36.033 に答える