2016-07-16 7 views
6

Die MDN binden Polyfill ist unten gezeigt.Erklärung einer Linie in MDN binden Polyfill

Ich versuche, den Zweck der

this instanceof fNOP ? this : oThis 

im fToBind.apply Aufruf zu erarbeiten.

Ich kann mich nicht darum kümmern. Kann jemand helfen, etwas Licht zu geben?

Function.prototype.bindMdn = function(oThis) { 
    if (typeof this !== 'function') { 
     // closest thing possible to the ECMAScript 5 
     // internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
    } 
    var aArgs = Array.prototype.slice.call(arguments, 1) 
     , fToBind = this 
     , fNOP = function() {} 
     , fBound = function() { 
     return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); 
    } 
    ; 
    if (this.prototype) { 
     // Function.prototype doesn't have a prototype property 
     fNOP.prototype = this.prototype; 
    } 
    fBound.prototype = new fNOP(); 
    return fBound; 
}; 

Es scheint ein Kurzschluss, wenn eine Instanz der gebundenen Funktion sein wird als das Ziel geliefert wird, wenn die gebundene Funktion aufruft, aber die typeof Überprüfung sollte diese fangen, so verstehe ich nicht seine Präsenz.

Link zur MDN Seite:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

Edit: Dies ist eine andere Frage aus dem vorgeschlagenen Duplikat. Das vorgeschlagene Duplikat fragt, warum fNOP benötigt wird. Ich grabe das völlig.

Diese Frage ist, warum die instanceof Prüfung benötigt wird und welche Funktion es dient. Ich präsentiere meine Kurzschlusshypothese oben, zusammen mit einem Grund, warum das keinen vollen Sinn ergibt.

+1

Würden Sie bitte den Link der MDN-Seite hinzufügen? –

+0

@mortezaT [MDN: Function.prototype.bind() Polyfill] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill) –

+0

Wahrscheinlich ein Duplikat von [ MDN Function.prototype.bind gebundene Funktion aufgerufen als Konstruktor] (http://stackoverflow.com/questions/23693282) –

Antwort

4

Wenn Sie das Ergebnis eines .bind eine neue Instanz mit new zu erstellen:

function TestClass(a,b,c,d) { 
} 

var TestClassBound = TestClass.bindMdn(null, 1, 2, 3); 

new TestClassBound(); 

Dann this instanceof fNOPtrue ist.

The typeof this !== 'function' ist nur dort zu testen, ob es sich um eine normale Art und Weise auf eine Funktion und nicht mit call oder apply oder um sicherzustellen, dass es nicht kopiert wurde, auf einen anderen Objekte Prototyp genannt wurde. So ist es nur so etwas wie

Function.prototype.bind.call("Not a function", 1, 2, 3); 

Oder

var testObj = {}; 
testObj.bind = Function.prototype.bind; 

testObj.bind(1,2,3); 

Für jeden regelmäßigen Aufruf von bind auf eine Funktion verhindern die typeof this immer function sein wird.

Also die typeof this !== 'function' ist zu überprüfen, ob das Objekt bind aufgerufen wird, ist wirklich eine Funktion.

Und die this instanceof fNOP innerhalb der fBind stellt sicher, dass das Verhalten korrekt ist, wenn das Ergebnis der Bindung verwendet wird.

+0

_ "Und diese Instanz von fNOP innerhalb von fBind stellt sicher, dass das Verhalten korrekt ist, wenn das Ergebnis der Bindung verwendet wird." _ Welches Verhalten? Mein Verständnis ist, wenn Sie den Funktionsaufruf mit einem "neuen" voranstellen, wird die hard-bound-Funktion mit einem einfachen neuen Objekt aufgerufen, das an die hartgebundene Funktion "this" gebunden ist, also ist diese Instanz von fNOP gleich '[plain object erstellt wegen new] instanceof fNOP', was bedeutet, dass die Bedingung false zurückgibt (da' fNOP's Prototyp in der Prototypkette des neu erstellten Objekts nicht existiert), was bedeutet, dass 'this' gesetzt wird falsch – Taurus

+0

Also 'this' wird an' oThis' gebunden, was nicht der Fall sein sollte, wenn der 'new' Operator verwendet wird, wenn der' new' Operator verwendet wird, sollte 'this' an das neue erstellte Objekt gebunden werden durch den 'neuen' Betreiber hinter den Kulissen. – Taurus

+0

Außerdem, wofür steht 'fNOP'? Ich nehme an, das "f" ist da für "Funktion", was ist mit den anderen drei Buchstaben? – Taurus

Verwandte Themen