2016-03-19 17 views
4

Lassen Sie uns Beispiele siehe:Wie funktionieren diese Code-Blöcke in JavaScript?

zuerst:

var user = { 
    firstName: "John", 
    sayHi: function() { 
    alert(this.firstName); 
    } 
}; 

setTimeout(function() { 
    user.sayHi(); // John 
}, 1000); 

Sekunde:

var user = { 
    firstName: "John", 
    sayHi: function() { 
    alert(this.firstName); 
    } 
}; 

setTimeout(user.sayHi, 1000);// undefined 

Warum im zweiten Beispiel undefined? Und wie funktioniert das?

Antwort

4

Wenn Sie eine Funktionsreferenz an eine setTimeout-Funktion übergeben, wird die übergebene Funktionsreferenz im Bereich window ausgeführt. So window.firstName wird undefined sein, da Sie keine Eigenschaft in window Objekt so haben.

var user = { 
    firstName: "John", 
    sayHi: function() { 
    alert(this.firstName); 
    } 
}; 

setTimeout(user.sayHi.bind(user), 1000); 

Wie Sie im obigen Code sehen können, müssen Sie den Bereich explizit an die Funktionsreferenz binden. Und auch Sie können die traditionelle Weise verwenden, die eine anonyme Funktion wie unten verwendet,

setTimeout(function(){ user.sayHi(); }, 1000); 
+0

Vielen Dank, aber ich verstehe nicht, wie funktioniert Ihr Beispiel mit anonymer Funktion? Wie spart das den Kontext? –

+0

@JimButton Mit der anonymen Funktion wird es eine Schließung. Ich meine den Objektbenutzer. Aber mit dem ersten Fall wird Internally setTimeout den übergebenen Funktionsverweis wie 'reference.call (scope)' aufrufen, wobei scope das Fenster ist, wenn es nicht überschrieben wurde. also wäre this.firstName ähnlich zu window.firstName. –

+1

Vielen Dank für Ihre Hilfe! –

Verwandte Themen