2016-06-07 8 views
1

Ich habe einen sehr einfachen Code getestet und es wurde erwartet, dass ich einen Fehler erhalte, aber ich habe eine Zeichenfolge "result" von der Konsole zurückgegeben! HierJavaScript gibt "result" anstelle von Fehler oder Ausnahme zurück

ist der Code:

var person = { name: "Mohammad", last_name: "Kermani"}; 

var show_person = function (age){ 
    console.log(this.name +" is "+ age + " years old"); 
} 

Nun jetzt Sie können wir nicht this.name verwenden, wenn JavaScript nicht weiß, was this (Objekt), dann müssen wir call oder apply verwenden.

Nun, wenn ich dies schrieb, bekam ich "Ergebnis" string (statt Fehler oder Warnung):

show_person(20); //Returns: result is 20 years old 

Siehe Jsfiddle und was Konsole kehrt zurück.

show_person.call(person, 20); //Returns: Mohammad is 20 years old 

Was die Zeichenfolge „Ergebnis“ ist und warum JavaScript-Fehler nicht zurück, wenn sie keinen Zugriff auf this.name haben:

Der Code mit call sollte aussehen?

Und was passiert, wenn wir kein Objekt in einer Funktion verwenden und eine seiner Eigenschaften erhalten möchten?(wie hier wollte ich Name der Person-Objekt erhalten)

+0

Mögliches Duplikat von [Wie funktioniert das "dieses" Schlüsselwort?] (Http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Andreas

+0

die Ausgabe des Ausdrucks 'show_person (20); 'ist 20 Jahre alt in Chrom. – viveksinghggits

Antwort

4

In diesem Zusammenhang this auf die globale window Objekt verweist. Und window.name ist "result" auf jsFiddle, wie es der Ergebnisrahmen ist.

+0

Danke, bedeutet das, wenn ich JavaScript nicht sagen "Dies ist das Objekt, das Sie verwenden sollten" wird es Fensterobjekte verwenden? – M98

+1

In Webbrowsern zeigt 'this' beim Laden der Seite immer auf das globale' window' Objekt. Aus diesem Grund können Sie z. Die 'setTimeout()' Funktion oder das 'sessionStorage', etc .. – meskobalazs

+0

Fenster ist das Wurzelmodell OBJECT. Alles Rest liegt im Fenster. Betrachte es als Browserfenster, in dem all dein Webprojekt lebt. –

1

Javascript weiß perfekt, worauf sich das bezieht. Solange Ihre Funktion nicht in einer bestimmten Umgebung enthalten ist, zeigt diese Referenz auf das globale Objekt Fenster.

+0

Der Wert von 'this' hängt hauptsächlich davon ab, wie die Funktion aufgerufen wird und nicht wo sie definiert ist. Ich verstehe nicht, was Sie mit * meinen "solange Ihre Funktion nicht in einer bestimmten Umgebung eingeschlossen ist" *. –

+0

In einer Umgebung residieren bedeutet, dass sie sich in einem globalen Namespace befindet und nicht in einem bestimmten. Der globale Namespace in JS ist also ein Fenster. Ich glaube nicht, dass ich etwas Unklares gesagt habe –

+0

In 'function foo() {function bar() {console.log (this); } Bar(); } ',' this 'bezieht sich auch auf' window', obwohl 'bar' nicht global ist. Aber vielleicht hast du das nicht gemeint und ich missverstehe dich? –

0

hier ein Arbeitsstück der Code tut, was Sie versuchen zu erreichen: mit der Person Eigenschaft

function PersonShower(){ 
    this.person = { name: "Mohammad", last_name: "Kermani"}; 

} 
PersonShower.prototype.show_person = function (age){ 
    console.log(this.person.name +" is "+ age + " years old"); 
} 
var p = new PersonShower(); 
p.show_person(20); 

Die PersonShower ist jetzt ein Objekt (die als Konstruktor Argument übergeben werden könnte) Dann wird ein show_person Methode ist für den Objektprototyp definiert.

Auf diese Weise bezieht sich die Verwendung auf die PersoShower-Instanz.

https://jsfiddle.net/57t9sadr/4/

Hoffe, dass es

1

hilft Sie sind wahrscheinlich für etwas wie folgt aussehen:

function Person (opt) { 
    this.name = opt.name; 
    this.lastName = opt.lastName; 
    this.age = opt.age; 
} 

Person.prototype.showPerson = function() { 
    console.log(this.name, 'is', this.age, 'old'); 
} 

var muhammed = new Person({ 
    name: 'Muhammed', 
    lastName: 'Kermani', 
    age: 20 
}); 

console.log(muhammed.showPerson()); 
console.log(muhammed.name); 
console.log(muhammed.lastName); 
+0

Nein, war ich nicht. Ich wusste einfach nicht, warum "result" zurückkehrte. Danke – M98

+0

Kein Problem. Diese Frage wurde bereits beantwortet, so dass dies nur ein Beispiel mit dem richtigen "this" Kontext zeigen sollte. Die Verwendung von call, apply oder bind ist ein unnötiger Workaround in Ihrem Beispiel ... – Rudi

+0

Vielen Dank. Das hilft mir, mehr zu verstehen – M98

0

window.name ist ein reservierter Referenz verwendet Fensterobjekte zu identifizieren. Wird häufig zum Identifizieren von Frames für den Datentransport verwendet.

JSFiddle verwendet den Frame Ergebnis, von dem Sie diese Referenz erhalten. Im Gegensatz dazu verwendet JSBin "JS Bin Output" als window.name

Standardmäßig wird es eine leere Zeichenfolge sein. Aus diesem Grund wird window.name in den meisten Browsern eine leere Zeichenfolge sein, die im Vergleich zu anderen undefinierten Eigenschaften eine Ausnahme darstellt.

You can learn more about window.name on MDN.

Ich kann sehen, dass Sie lexikalischen Gültigkeitsbereich zu verstehen scheinen. Lass mich wissen, wenn du mir erklären möchtest, wie verbindlich und lexikalisch funktioniert.