2014-06-29 11 views
5
var x=(function(){var u=1;})(); 

console.log(x.u); // undefined 

Gibt es überhaupt einen Weg, Ether zu bekommen, Zugriff oder schließlich console.log Sie?Gibt es eine clevere Möglichkeit, auf eine Variable innerhalb einer umbrochenen Funktion zuzugreifen?

Gibt es einen Code, den ich in x einfügen könnte, der Sie von außen ungeschützt machen könnte?

Edit: Ich meine, ohne "direkt" zurückzukehren. Gibt es eine Möglichkeit, dich versehentlich auszusetzen?

+0

Ich glaube nicht, dass es gibt, aber was ist das nötig. – Mritunjay

+0

wer unterminiert jemanden dort erste Frage ?? (Ich habe nie gesagt "Ich benutze" oder "für"!) – 8DK

+1

gut, wenn Sie nicht bemerkt haben, ist 'x' undefined. Wenn du auf den Wert außerhalb zugreifen willst, mache es global –

Antwort

6

Kurze Antwort: Nein. Privat ist privat ist privat.

Etwas längere Antwort: Javascript schützt nicht vor unausgereifte oder ausgeführt Codierung, versehentlich die var fehlt oder die Rückkehr oder eine Eigenschaftenaccessor in einer Objekteinstellung (this.u = 1;) (oder eine Variable in einem subscope * Zugriff) oder schwacher Kaffee.

Bei korrekter Verwendung und gutem Verständnis muss das Aussetzen lokaler/privater Variablen in einem Bereich mit einer bestimmten Absicht erfolgen. Wenn es ein magisches Voodoo gibt, das deine kostbare Variable aussetzen kann, habe ich es nicht gesehen. (Hat das Fehlen von Beweisen beweisen oder zu widerlegen, ob die Yetis Stiele dieser Erde?!?)

Dies beinhaltet, ist aber nicht beschränkt auf:

  • Marauding Aliens
  • twerking Miley Cyrus
  • der Papst (Vorsicht des Beichtstuhl, lose Lippen ...)
  • Fat Albert
  • die Tea Party
  • Austin Power Katze
  • Nihilisten
  • Moops
  • Baby-Nashörner
  • El Yeti, geb., Hefe

Et cetera, et cetera.

* Gunmen auf dem grasigen Noll?

+0

Sie vergessen Satan – 8DK

+1

Ja, [ihn auch] (http://www.nhl.com/ ice/player.htm? id = 8459534). –

+0

Flying Spaghetti Monster –

1

Nein, es gibt keinen Weg. Nachdem die Funktion ausgeführt wurde, ist keine Variable mehr übrig, die einen Verweis auf den Wert u enthält. Daher wird der Wert von u Müll gesammelt und wird verloren gehen.

+0

Es wird Müll gesammelt werden, aber wenn das auftritt wird unbekannt sein. –

+1

@JaredFarrish Ja, es ist unbekannt, aber die Tatsache, dass es passieren wird, ist ein Beweis, dass Sie nicht mehr auf den Wert von "u" zugreifen können, da alles, was Sie tun würden, zu undefiniertem Verhalten führen würde, da der Wert möglicherweise nicht stimmt schon Müll gesammelt. – basilikum

+0

Alles ist Müll gesammelt irgendwann. –

1

Ich hasse den Begriff "privat", weil er folgert, dass der Inhalt vor der Sicht geschützt ist.

<script id="MyScript"> 
x=(function(){var u=1;})(); 
</script> 
<script> 
myvar = document.getElementById("MyScript").innerText; 
document.write(myvar); 
</script> 

u zerstört wird, (wie im nicht-Speicher Leck), aber der Quellencode ist nicht und ist ansichts der Lage, wenn auch mit JavaScript JavaScript Parsing schmerzhaft ist.

+1

var u = Math.random(); Drucke das aus! – 8DK

+0

@ 8DK das wäre jenseits meiner Fähigkeiten. – Wayne

1
(function() { 
    var bar = {}; 
    bar.u = Number(0); 
    var x = (function(foo){ 
    var u = foo.u = (function(n) { return !foo.n ? n : foo.n }(1)) ; 
    })(bar); 

console.log(bar.u, x, typeof x); 
}()); 

console.log(x, u, window.bar, window.foo); 

jsfiddle http://jsfiddle.net/guest271314/9qqpA/

+0

Der einzige Grund, der funktioniert, ist, weil [Sie übergeben globalen Geltungsbereich ("Fenster")] (http://jsfiddle.net/6jzfr/). Dies würde entweder als absichtlicher (wenn es absichtlich gemacht wird) oder als Fehler bei der Arbeit mit der Pflanze gewertet werden. –

+0

Aktualisierung auf lokales Objekt 'bar'. Danke – guest271314

+0

Das ist kein lokales Objekt, es ist eine globale Variable, z.B. 'window.bar' (oder es ist in einem höheren Bereich). Und es ist die gleiche Situation, Sie übergeben die Variable und greifen damit absichtlich auf den Wert zu, den Sie zweimal einstellen, von denen einer * nicht-lokal * ist. Dies ist mehr als eine Verschleierung dieser Demonstration. –

0

Ja, Sie können es aussetzen, indem sie es an die Funktion Befestigung selbst:

var fn = function(){ 
    this.u = "Secret value!"; 
    return "Public value"; 
} 
var x = fn.bind(fn)(); 

$('#returned').text(x); 
$('#result').text(fn.u); 

Fiddle: http://jsfiddle.net/b29Xg/1/

ich dies nützlich für das Debuggen sehen konnte, aber es hat auch das Potenzial, sehr hartnäckige Bugs einzuführen, wenn Sie nicht vorsichtig sind.

Verwandte Themen