2017-01-05 2 views
-1

Ich habe einige Regeln gelesen, um festzustellen, was der Wert this in verschiedenen Szenarien in Javascript ist. Alles war gut, bis das Beispiel unten mich abwarf.Verwenden Sie dies in Javascript

function Person(name){ 
    this.name = name; //this is the object when function used as constructor (as expected) 
    this.changeName = someFunction(); // produces error 

    function someFunction(){ 
    this.nickName = this.name+"by"; //this is now the global object and not the instance, thus the name property does not exist. 

    } 
} 

var a = new Person ('bob'); //error due to the function in changeName property. 

Von dem, was ich verstanden, die this Variable nimmt den Wert des rufenden Objekts auf, wenn durch Punktschreibweise bezeichnet oder den Wert der neu konstruierten Funktion einnimmt, wenn mit dem new Schlüsselwort verwendet.

Kann jemand erklären, warum die obige Anweisung in der obigen Funktion das globale Objekt und nicht das neu instanziierte Objekt ist?

Antwort

1

Kann jemand erklären, warum die obige Anweisung in der obigen Funktion das globale Objekt und nicht das neu instanziierte Objekt ist?

Denn wenn Sie eine (n ungebunden) Funktion als func() nennen, this auf das globale Objekt beziehen (oder undefined, wenn die Funktion im Strict-Modus ist).

Jede Funktion (außer Pfeilfunktionen) hat ihren eigenen this Wert. Die Tatsache, dass Sie Person als new Person() anrufen und dass this innerhalb Person bezieht sich auf ein neues Objekt, hat keinen Einfluss auf die this Wert in someFunction. Es zählt nur, wie Sie können someFunction.

Sie könnten someFunction nennen und stellen ausdrücklich seine this Wert über .call:

this.changeName = someFunction.call(this); 

Siehe auch: How to access the correct `this` inside a callback?

+0

Es beantwortet, warum meine Implementierung falsch ist. Vielen Dank. Ich habe bereits die Funktion call() in meinem Fix verwendet, als ich erkannte, dass es sich um das globale Objekt handelte, aber ich brauchte einen Grund zu wissen, warum es das globale Objekt war. Das ist die Erklärung, nach der ich gesucht habe (Y). – alaboudi

0

Die this innerhalb someFunction() wird ein globales Objekt verweisen, weil es in einem Funktionsaufruf ist. Eine ausführlichere, ausführlichere Erklärung finden Sie unter How does "this" keyword work within a function?

Wenn Sie das Problem lösen möchten, Alias ​​this innerhalb der Eltern.

function Person(name){ 
    var self = this; // Store a reference to the current instance 
    self.name = name; 

    self.changeName = someFunction(); // Odd that you'd capture the return value of a setter, ... 

    function someFunction(){ 
    self.nickName = self.name+"by"; //self references the instance, creating the property. 

    } 
} 
Verwandte Themen