2013-01-17 6 views
13

Sagen, ich habe diese anonyme Funktion:JavaScript: access Variablen innerhalb anonyme Funktion von außen

(function(window){ 

var private = 'private msg'; 

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

document.body.onclick = sayit; // works 

})(window); 

// private shouldn't be accessible here 

Ist dies, wie JavaScript verhalten soll?

Das heißt, es gibt keine Möglichkeit private von irgendwo außerhalb dieser anonymen Funktion zuzugreifen?

Wenn ja, ist es möglich, eine Art von Hack zu finden, um von außen auf private zugreifen, so dass der Code so wie es ist?

+0

Nicht ohne den Code zu ändern. – Blender

+0

private Variablen sollen privat sein ... warum möchten Sie von außen auf eine private Variable zugreifen? – rexcfnghk

+0

@ rexcfnghk - es ist nicht so viel. es ist einer jener Momente, in denen "das ist, nur weil das so funktioniert" –

Antwort

9

Ja, so können Sie in Javascript "private" Variablen haben (versteckt in einem Funktionsumfang).

Nein, es gibt keinen Hack für den Zugriff auf Variablen wie private, ohne den Code neu schreiben zu müssen.

Auf Variablen, die mit var innerhalb einer Funktion definiert sind, kann nur innerhalb dieser Funktion zugegriffen werden.

-1

Sie würden, so etwas zu tun haben:

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

Das ist der springende Punkt ist Umfang und private Variablen mit

Entweder

den privaten Wert auf eine globale Variable Set?

oder

erklären die Variable außerhalb

6

Ok. Ich hab es geschafft.

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

Nachdem Sie Körper klicken, können Sie 'private msg' von extracted

+0

Clever. Nur können Sie den Wert von 'privat' nicht ändern * also haben Sie nur Lesezugriff. – Faiz

+0

@ Faiz Sie haben Recht. Vielleicht gibt es keine Möglichkeit zu "Zugang". –

+0

@SangYeobBonoYu lol! – neoDev

1

bekommen Sie werden nicht als "private" Variablen bestimmt sind; So funktionieren Verschlüsse. Sie können dasselbe in Perl und Python tun, zumindest und wahrscheinlich in vielen anderen Sprachen mit Closures und lexikalischem Scoping.

Debugger wie Firebug oder Chrome Inspector können Ihnen immer noch den gesamten Stack anzeigen (einschließlich geschlossener Variablen), aber abgesehen davon und ohne den ursprünglichen Code zu ändern, denke ich, dass Sie kein Glück haben.

Vielleicht, wenn Sie uns Ihr tatsächliches Problem gesagt haben ... :)

+0

Wird Closure == anonyme Funktion? – steve

+0

@barjonah - sie sind verwandt, aber nicht gleich. Es ist leicht, mit der Deklaration anonymer Funktionen eine Schließung zu bilden.Eine Schließung wird gebildet, wenn eine anonyme (oder sogar eine verschachtelte oder reguläre benannte Funktion) auf Variablen in ihrem übergeordneten Bereich verweist. Eine anonyme Funktion ist also eine Möglichkeit, eine Schließung zu schaffen. – Faiz

+0

Ich kann nicht helfen, aber ich habe das Gefühl [ich antwortete dies bereits] (http://Stackoverflow.com/a/150185/17875) :) aber Faiz ist richtig, ja. – Eevee