Dieses Objekt war schon immer eine Falle in js. Es ist schwierig zu beurteilen, worauf es hinweist, und wir machen aufgrund unserer Erfahrung mit self aus C oder Python oft einen solchen Fehler. Lassen Sie uns als Nächstes ausführlich über den Besitz dieses Objekts sprechen.
Regel1: Dies
der globalen Umwelt
Die Umgebung von JavaScript wird von Natur aus durch Funktionen bestimmt. Die Umgebung, die nicht durch Funktionen umschlossen ist, ist die globale Umgebung, die auf das globale Variablenfenster verweist das folgende Beispiel
var name='jjj';
console.log(this.name);
//wird jjj
erfolgreich ausgeben
Regel2: Dies, wenn es als Methode aufgerufen wird
Offensichtlich ist diese Situation leicht zu beurteilen. Sie stimmt mit self in Python überein. Dies weist zweifellos auf das Objekt hin, das die Methode aufruft
var user={
Name:'kkk'
};
user.getName=function(){
console.log(this.name);
};
user.getName();
//wird ausgegebenkkk
Regel3: Dies
bei Verwendung als Konstruktor
Es ist unnötig zu erwähnen, dass dies zu diesem Zeitpunkt offensichtlich auf das neu erstellte Objekt verweist. Durch die Ausführung des Konstruktors wird das Objekt nur initialisiert. Das Objekt wurde vor der Ausführung erstellt
Hier sind einige Beispiele
Funktion Benutzer(name){
This.name=name;
}
var f1=new User('kkk');
var f2=Benutzer('kkk');
console.log(f1.name);//kkk
console.log(f2.name);//undefiniert hat kein Namensattribut
Regel 4: Dies
im indirekten Aufruf
Der sogenannte indirekte Aufruf bezieht sich auf die Verwendung von Apply- und Call-to-Call-Funktionen. Zu diesem Zeitpunkt verweist dies auf den ersten Parameter in ihrer Parameterliste.
var setName=function(name){
This.name=name;
};
var user={level:2};
user.apply(setName,'jjj');
console.log(user.name);//jjj
Regel 5: Dies gilt auch für andere Situationen
Denken Sie daran, dass dies in anderen Fällen nicht geändert wird, da hier Fehler am wahrscheinlichsten passieren.
var name = "clever coder";
var person = {
Name: „foocoder“,
Hallo: function(sth){
var sayhello = function(sth) {
console.log(this.name " sagt " etw);
};
sayhello(sth);
}
}
person.hello("Hallo Welt");//Cleverer Programmierer sagt Hallo Welt
Der obige Code sieht seltsam aus. Sollte das nicht auf eine Person hinweisen?
Wir sollten bedenken, dass this in der verschachtelten Funktion nicht auf die Funktion zeigt, in der es verschachtelt ist. In diesem Beispiel zeigt this in sayhello nicht auf die Funktion, die hello entspricht. Wenn wir das Beispiel leicht ändern, wird es zu
hallo:function(sth){
console.log(this.name " sagt " etw);
}
//foocoder sagt Hallo Welt
Jeder hätte verstehen sollen, dass sayhello derzeit nicht als Methode aufgerufen wird, also auf das globale Objekt verweist. . .
Zu diesem Zeitpunkt tritt das Problem auf. Wenn Sie das erste Beispiel mit node ausführen, wird undefiniert angezeigt. Ich frage mich, ob es jemand erklären kann.
Regel6:Bewertung verstößt gegen alle Regeln
Schließen Sie mit einem Beispiel ab
Code kopieren Der Code lautet wie folgt:
var name = "clever coder";
var user={
Name:'kkk'
};
user.getName=function(){
console.log(this.name);
};
var get=user.getName;
get();//cleverer Coder
Verstehst du?