2016-07-21 16 views
1

Wenn ich den folgenden Javascript-Schnipsel ausführen ...Bindung eine Javascript-Funktion mit null oder nicht definiert als thisArg

function addAndThis(n1, n2) { 
    console.log("THIS:" + this + " SUM:" + (n1+n2)); 
} 

var boundNullThisAddAndThis = addAndThis.bind(null); 
var boundUndefinedThisddAndThis = addAndThis.bind(undefined); 
var boundStringThisAddAndThis = addAndThis.bind("TEST"); 

addAndThis(10, 20); 
boundNullThisAddAndThis(100, 200); 
boundUndefinedThisddAndThis(1000, 2000); 
boundStringThisAddAndThis(10000, 20000); 

... ich diese Ausgabe erhalten:

THIS:[object Window] SUM:30 
THIS:[object Window] SUM:300 
THIS:[object Window] SUM:3000 
THIS:TEST SUM:30000 

Die erste und die letzte Zeile der Ausgang ist wie ich erwartet habe. Aber warum ruft die gebundene Funktion, die von Function.prototype.bind erstellt wird, die umbrochene Funktion nicht mit einem Dies von null oder undefiniert auf? Ich habe nichts über dieses Verhalten im Netz gefunden.

+1

Wenn Sie "Use strict" hinzufügen; Zu Beginn der Funktion verhält es sich wie erwartet, also werden null/undefiniert standardmäßig ins Fenster übersetzt, es sei denn, strikter Modus ist im Spiel? – sielakos

+0

Ja, wenn Sie an null oder undefiniert binden, bedeutet dies den globalen Kontext – cstuncsik

Antwort

2

Es ist wahrscheinlich ein Problem mit dem Versuch, ein Nicht-Objekt als Kontext zu verwenden. Der Versuch, ein Primitiv zu verwenden (fn.call(1)), "boxt" den Wert und verwandelt das Primitiv in ein Objekt, das als Kontext verwendet wird.

Die .call().apply() und .bind() Funktionen übernehmen alle „Nully“ Werte und verwendet die Standard window Objekt statt.

Wie andere (und auch auf der MDN-Seite) darauf hingewiesen haben, geschieht dies nicht im strikten Modus. Seltsamerweise, während die meiste Zeit der strikte Modus dir Kinderhandschuhe anzieht, vertraut er in diesem Fall darauf, dass du weißt, was du tust! ; P

[MDN]

+0

Wie andere (und auch auf der MDN-Seite) darauf hingewiesen haben, geschieht dies nicht im strikten Modus. Seltsamerweise, während die meiste Zeit der strikte Modus dir Kinderhandschuhe anzieht, vertraut er in diesem Fall darauf, dass du weißt, was du tust! ; P – Whothehellisthat