2016-05-15 6 views
2

ich zur Zeit das Lernen über diesem Beispiel Javascript und kamWarum wird der Wert dieser Variablen nicht definiert

var t = function() 
{ 
    this.name = "Jam"; 
    no = "123"; 
} 

console.log(t.no); //Undefined 
var m = new t(); 
console.log(m.name); 

Warum ist die erste Anweisung nicht definiert?

+1

Weil 't' Funktion ist, kein Objekt. –

+1

@BlazeSahlzen - Funktionen * sind * Objekte. – nnnnnn

+0

@nnnnnn Ich hätte genauer sein sollen. Was ich sagen wollte, ist, dass man, um auf die Eigenschaften von 'function'' t' zugreifen zu können, diese instanziieren müsste (d. H., Verwandle es in ein 'Objekt'). –

Antwort

5

t ist ein Funktionsobjekt. Wie jedes andere Objekt können der Funktion Eigenschaften zugewiesen sein. Also, um Ihren Code zu arbeiten, müssen Sie "123" zu no Eigentum Ihrer Funktion (Linie A) zuordnen:

var t = function() 
{ 
    this.name = "Jam"; 
} 
t.no = "123"; // line A 

console.log(t.no); // "123" 
var m = new t(); 
console.log(m.name); 
+0

großartige Erklärung, danke –

1

Da t eine Funktion ist, die von t(); ausgeführt würde. no Auf der anderen Seite ist eine globale Scooed-Variable, die ohne Präfix von überall erreicht wird.

+0

"' no 'andererseits ist eine interne Variable "Es erscheint aus dem Beispiel, dass' no 'eine implizite globale Variable ist, da' var', 'let' oder' const' keine Schlüsselwörter sind. – zzzzBov

+0

Ich habe tatsächlich festgestellt, dass es noch schlimmer ist. 'no' ist nicht mit "var" vorne deklariert, also ist es jetzt eine GLOBALE Variable. Tue das nie oder es passieren schlimme Dinge! ;) –

+0

@zzzzBov ja, nein ist nicht Teil von t. Du erreichst es ohne Präfix. –

1

t ist eine Funktion Ausdruck. Sie Ihnen ein zurückgegebene Objekt einer Funktion wie t().no zugreifen können, oder Sie können mit der Funktion als Konstruktor wie diese

myT = new t() 
console.log(t.no); 

Aber Ihr no Variable ist nur eine globale Variable innerhalb der Funktion ein neues Objekt erstellen und es ist weder ein Teil dessen, was zurückgegeben wird, noch an das zurückkehrende Objekt der Konstruktorfunktion gebunden ist.

Here ist ein sehr gutes Tutorial, das alle diese Themen in Tiefen abdeckt.

+1

Wie unter meiner eigenen Antwort kommentiert, ist nein eigentlich * nicht * privat, aber * global * Bereich .. Schlechter Code kann schwierig zu lesen sein .. :) –

+0

* "Ihre' nein' Variable ist nur ein private variable "* - Diese Variable ist global (weil sie nicht mit' var' deklariert wurde). – nnnnnn

+0

Korrigiert. Danke für das Aufzeigen. –

2

Warum ist die erste Aussage undefiniert?

Da t keine Eigenschaft hat no.

Zunächst einmal der Code innerhalb die Funktion, nämlich

this.name = "Jam"; 
no = "123"; 

wird nur dann ausgeführt, wenn die Funktion genannt wird. Sie tun dies mit var m = new t();, die nachconsole.log(t.no); kommt.

Zweitens, no = "123";nicht erstellen Sie eine Eigenschaft auf dem Funktionsobjekt. Es wird versucht, den Wert der Variablen no festzulegen. Da die Variable in Ihrem Beispiel nicht vorhanden ist, erstellt diese Zeile entweder eine globale Variableno oder einen Fehler, wenn Ihr Code in strict mode ist.

Betrachten Sie das folgende Beispiel:

var no = 21; 
function foo() { 
    no = 42; 
} 
console.log(no); // 21 
foo(); 
console.log(no); // 42 
Verwandte Themen