2013-01-17 19 views
13

Say mam tę anonimową funkcję:JavaScript: zmienne wewnątrz funkcji anonimowy dostęp z zewnątrz

(function(window){ 

var private = 'private msg'; 

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

document.body.onclick = sayit; // works 

})(window); 

// private shouldn't be accessible here 

Czy tak powinien zachowywać JavaScript?

To znaczy, że nie ma sposobu uzyskania dostępu do private z dowolnego miejsca poza tą anonimową funkcją?

Jeśli tak, to czy można znaleźć jakiś hack, aby uzyskać dostęp do private z zewnątrz, pozostawiając kod taki, jaki jest?

+0

Nie zmieniając kodu. – Blender

+0

zmienne prywatne mają być prywatne ... dlaczego chciałbyś uzyskać dostęp do zmiennej prywatnej z zewnątrz? – rexcfnghk

+0

@ rexcfnghk - to nie tak dużo. to jedna z tych chwil, w których "to tylko dlatego, że to działa" –

Odpowiedz

9

Tak, w ten sposób Javascript pozwala ci mieć "prywatne" zmienne (ukryte w zakresie funkcji).

Nie, nie ma hackowania, aby uzyskać dostęp do zmiennych, takich jak private, bez ponownego wpisywania kodu.

Zmienne zdefiniowane za pomocą var w ramach funkcji można uzyskać tylko z poziomu tej funkcji.

-1

Trzeba by zrobić coś takiego:

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' 
0

To cały sens posiadania zakres i zmiennych prywatnych

Albo

ustawić wartość prywatnego do zmiennej globalnej?

lub

zadeklarować zmienną poza

6

OK. Mam to.

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

Po kliknięciu ciało, można dostać „prywatny wiad” z extracted

+0

Sprytny. Tylko nie możesz * zmienić * wartości 'private', więc masz dostęp tylko do odczytu 'access'. – Faiz

+0

@Faiz Masz rację. Może nie ma sposobu na "dostęp". –

+0

@SangYeobBonoYu lol! – neoDev

1

nie są przeznaczone jako „prywatne” zmiennych; tak właśnie działają zamknięcia. Możesz zrobić to samo w Perlu i Pythonie, i prawdopodobnie w wielu innych językach z zamknięciami i leksykalnymi zagadnieniami.

Debugery takie jak Firebug czy Inspektor przeglądarki Chrome mogą nadal wyświetlać cały stos w dowolnym momencie (łącznie ze zmiennymi zamkniętymi), ale poza tym i bez zmiany oryginalnego kodu, myślę, że nie masz szczęścia.

Być może, jeśli powiesz nam o swoim rzeczywistym problemie ... :)

+0

Czy zamknięcie == anonimowa funkcja? – steve

+0

@barjonah - są powiązane, ale nie takie same. Łatwo jest utworzyć zamknięcie z deklaracją anonimowych funkcji.Zamknięcie powstaje, gdy anonimowa (lub nawet zagnieżdżona lub zwykła nazwana funkcja) odnosi się do zmiennych w jego zakresie rodzica. Tak więc anonimowa funkcja jest jednym ze sposobów tworzenia zamknięcia. – Faiz

+0

Nie mogę pomóc, ale czuję, że [odpowiedziałem to wcześniej] (http://stackoverflow.com/a/150185/17875) :) ale Faiz jest poprawny, tak. – Eevee

Powiązane problemy