2016-07-16 135 views
6

Il polyfill MDN binding è mostrato di seguito.Spiegazione di una riga in MDN bind polyfill

sto cercando di capire lo scopo della

this instanceof fNOP ? this : oThis 

nel fToBind.apply invocazione.

Non riesco a capirlo. Qualcuno può aiutare a far luce?

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; 
}; 

sembra essere un cortocircuito se un'istanza della funzione legata è fornito come bersaglio quando si richiama la funzione vincolato, ma il controllo typeof dovrebbe prendere questo, quindi non comprendono la sua presenza.

Link alla pagina MDN:

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

Edit: Questa è una domanda diversa da quella suggerita duplicato. Il duplicato suggerito chiede perché è necessario fNOP. L'ho completamente bruciato.

Questa domanda spiega perché è necessario il controllo instanceof e quale funzione serve. Presento sopra la mia ipotesi di cortocircuito, insieme a una ragione per cui ciò non ha pienamente senso.

+1

Ti dispiacerebbe aggiungere il collegamento della pagina MDN per favore? –

+0

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

+0

Probabilmente un duplicato di [ Funzione associata MDN Function.prototype.bind chiamata come costruttore] (http://stackoverflow.com/questions/23693282) –

risposta

4

se si utilizza il risultato di una .bind per creare una nuova istanza con new:

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

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

new TestClassBound(); 

Poi this instanceof fNOP è true.

Il typeof this !== 'function' è solo lì per verificare se è stato chiamato un modo regolare su una funzione e non con call o apply o per assicurarsi che non è stato copiato un altro prototipo oggetti. Quindi prevenire solo qualcosa come

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

O

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

testObj.bind(1,2,3); 

Per ogni chiamata regolare di bind su una funzione del typeof this sarà sempre function.

Quindi il typeof this !== 'function' è per verificare se l'oggetto bind è chiamato è davvero una funzione.

E il this instanceof fNOP all'interno dello fBind assicura che il comportamento sia corretto quando viene utilizzato il risultato del collegamento.

+0

_ "E questa istanza di fNOP all'interno di fBind assicura che il comportamento sia corretto quando viene utilizzato il risultato del binding." _ Quale comportamento? La mia comprensione è che quando si antepone la chiamata alla funzione con un 'new', la funzione hard-bound verrà chiamata con un nuovo oggetto semplice associato alla funzione' this' dell'hard-bound, quindi 'questa instanceof fNOP' è la stessa di '[oggetto semplice creato a causa della nuova] instanceof fNOP', il che significa che la condizione restituirà false (poiché il prototipo di' fNOP' non esiste nella catena di prototipi dell'oggetto appena creato), il che significa che 'questo' sarà impostato in modo errato – Taurus

+0

Quindi 'this' verrà associato a' oThis', che non dovrebbe essere il caso se si utilizza l'operatore 'new', se si utilizza l'operatore' new', 'this' deve essere associato al nuovo oggetto creato dall'operatore 'nuovo' dietro le quinte. – Taurus

+0

Inoltre, cosa significa 'fNOP'? Presumo che la "f" sia lì per "funzione", e le altre tre lettere? – Taurus