この無名関数があるとしましょう:
(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
にアクセスするための何らかのハックを見つけることは可能ですか?
はい、これはJavaScriptが「プライベート」変数(関数スコープで非表示)を使用できるようにする方法です。
いいえ、コードを書き直さずにprivate
などの変数にアクセスするためのハックはありません。
関数内でvar
を使用して定義された変数には、その関数内からのみアクセスできます。
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
から「プライベートメッセージ」を取得できます
これらは「プライベート」変数として意図されたものではありません。これが、クロージャーが機能する方法です。少なくとも、PerlとPythonでは同じことができますが、おそらくクロージャーと字句スコープを備えた他の多くの言語でも同じことが言えます。
FirebugやChrome Inspectorなどのデバッガーは、いつでもスタック全体を表示できます(クローズドオーバー変数を含む)が、それ以外は、元のコードを変更せずに、運の。
多分あなたが私たちにあなたの実際の問題を言ったなら... :)
これがスコープとプライベート変数を持つことの要点です
どちらか
プライベート値をグローバル変数に設定しますか?
または
外部で変数を宣言する