Подтвердить что ты не робот

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 извне, оставив код таким, каким он есть?

4b9b3361

Ответ 1

Да, так Javascript позволяет вам иметь переменные 'private' (скрытые в области функций).

Нет, нет доступа для доступа к переменным типа private без повторной записи кода.

Переменные, определенные с помощью var внутри функции, могут быть доступны только из этой функции.

Ответ 2

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);

После того, как вы нажмете тело, вы можете получить "частный msg" из extracted

Ответ 3

Они не предназначены как переменные "private"; это то, как работают замыкания. Вы можете сделать то же самое в Perl и Python, по крайней мере, и, возможно, на многих других языках с закрытием и лексическим охватом.

Отладчики, такие как Firebug или Chrome Inspector, могут показать вам весь стек в любой момент (включая закрытые переменные), но кроме этого и без изменения исходного кода, я думаю, вам не повезло.

Возможно, если вы сказали нам свою фактическую проблему...:)

Ответ 4

То, что весь смысл наличия области и частных переменных

Либо

Задайте личное значение глобальной переменной?

или

объявить переменную снаружи

Ответ 5

Вам нужно было бы сделать что-то вроде этого:

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'