2012-03-29 6 views
1

Ich habe heute gehört, dass "es möglich ist, auf eine lokale Variable einer Funktion zuzugreifen, da alles in Javascript global ist".Ist es möglich, von außerhalb der Funktion auf eine lokale Variable der Funktion zuzugreifen?

Soweit ich weiß, können Sie nicht auf eine lokale Variable außerhalb des Gültigkeitsbereichs der Variablen zugreifen.

Zum Beispiel

function f() 
{ 
    var myvar = "something"; 
} 

myvar = "c"; // i'm not accessing myvar in f(); 

ich auch gehört, dass es möglich ist, zu verwenden for (var i in Fenstern) myvar zuzugreifen. Ich möchte bestätigen, dass es nicht möglich ist, da ich nicht der Autor der Sprache bin.

Aktualisiert:

Ich bat ihn, einen Code-Schnipsel, und hier ist das, was ich erhalten habe.

var person = { 
    whoIs : function() 
    { 
     var name = "name"; 
     return name; 
    } 
}; 


var str = "TEST:\n"; 

for(var n in person) 
{ 
    str += n; 
    str += " = [" + person[n] + "]\n"; 
} 

// perform regular exp. to get the value of name variable. 


alert(str); 

Es ist nicht die Variable Zugriff auf ......... es ist einfach das Drucken, wie die Funktion wie ...

+1

* „ist es möglich, eine lokale Variable einer Funktion zuzugreifen, da alles in Javascript global ist“ * dies definitiv falsch ist. – Behrang

+0

Um das ein wenig zu erweitern, hat JavaScript ein paar sehr seltsame Scoping (wenn Sie nicht damit vertraut sind), aber "alles in JavaScript ist ein globales" ist einfach falsch. Wie, lauf von diesem Entwickler falsch ab. – Corbin

+1

frage diesen Typen * "Wann hast du das letzte Mal JavaScript benutzt?" * – Joseph

Antwort

6

Das Entwickler falsch aussieht war. Diese beiden myvar sind unterschiedlich. Der äußere ist äquivalent zu window.myvar, aber der innere ist nur innerhalb der f.

Edit: ein sehr einfaches Beispiel: http://jsfiddle.net/mRkX3/

Edit 2:

Ein Zitat aus dem ECMAScript-Standard:

Wenn die Variable-Anweisung innerhalb einer FunctionDeclaration auftritt, werden die Variablen definiert mit Funktion-lokaler Bereich in dieser Funktion, wie in Abschnitt 10.1.3 beschrieben. Andernfalls werden sie mit einem globalen Gültigkeitsbereich definiert (dh sie werden als Mitglieder des globalen Objekts erstellt, wie in Abschnitt 10.1.3 beschrieben), indem sie die Eigenschaftsattribute {DontDelete} verwenden. Variablen werden erstellt, wenn der Ausführungsumfang eingegeben wird. Ein Block definiert keinen neuen Ausführungsbereich. Nur Program und FunctionDeclaration erzeugen einen neuen Bereich. Variablen werden bei der Erstellung auf undefiniert initialisiert. Eine Variable mit einem Initialisierer erhält den Wert ihrer AssignmentExpression, wenn das VariableStatement ausgeführt wird, nicht wenn die Variable erstellt wird.

durch http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting gefunden, obwohl dieser Artikel eine Dead (live Link: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf) verweist.

2

Ja, Sie haben Recht. Variablen, die innerhalb des Funktionsumfangs deklariert sind, sind außerhalb der Funktion nicht zugänglich. Wenn die Funktion myvar zurückgibt, ist es möglich, auf ihren Wert, aber nicht direkt auf die Variable zuzugreifen.

3

in Ihrem Fall myVar ist im Bereich der Funktion und wenn es dort mit var definiert ist, wird es nie nach außen zugänglich sein, aber wenn es nicht definiert ist, als Sie MyVar auf das globale Objekt (Fenster) festlegen und es könnte zu vielen Schwierigkeiten führen.

function(f) { 
myVar = "hello" 
} 

In diesem Fall können Sie myVar finden, weil es nicht innerhalb der Funktion definiert ist.

4

Klingt wie ein Kommunikationszusammenbruch. Ich wette, er hat versucht, den Punkt zu setzen, dass Sie eine globale Variable innerhalb einer Funktion definieren können, indem Sie sie an das Fensterobjekt anhängen. Versuchen:

function f() 
{ 
    window.myvar = "something"; 
} 

myvar = "c"; // overwriting "something" 
2

das Beispiel zu urteilen er verwendet (for(var i in window)) er eindeutig auf Ihre Funktionsvariablen zählt als global deklariert werden (ohne var fortfahren ihnen).

Da in diesem Fall alle definierten Variablen für das Objekt window gebunden sind, wäre es einfach, durch einfaches Überfahren des Fensterobjekts darauf zuzugreifen. Wenn Sie jedoch var verwenden, um lokale Funktionsvariablen zu deklarieren, sind sie nur für die Funktion selbst verfügbar (window Objekt enthält sie nicht).

3

In Ihrem Beispiel:

function f(){ 
    var myvar = "something"; 
} 

myvar = "c"; //nope, they are different. 

myvar = "c" bezieht sich auf window.myvar, die nicht die gleiche wie die myvar innerhalb f() ist. Sie können auf die Variablen innerhalb der Funktion nur zugreifen, wenn sie außerhalb dieser Funktion deklariert sind.

var myvar; 

function f(){ 
    myvar = "something"; 
} 

myvar = "c"; //now it changes "something" to "c"! 
-1
function f() 
{ 
    var myvar = "Moon"; 
} 

f(); 

myvar = "Sunlight"; 
Verwandte Themen