Underscore binding vs jQuery.proxy vs Native bind

Ho alcuni problemi di contesto in callback. Ho cercato su Google e ho trovato poche opzioni:

  1. Binding nativo – non supportato dai vecchi browser
  2. Proxy JQuery
  3. sottolineatura vincolo

Userò sicuramente il bind nativo se non dovessi supportare i vecchi browser. C’è qualche differenza significativa tra questi dovrebbe essere a conoscenza?

Questi potrebbero essere usati come alternativa a chiamare / applicare?

I metodi call e apply invocano una funzione. Il metodo bind restituisce un object funzione che può essere utilizzato come riferimento (per l’uso nei callback, ad esempio). Pertanto, il binding e call / apply non hanno generalmente gli stessi casi d’uso.

Detto questo, MDN ha un polyfill per il metodo bind di un object funzione direttamente sulla pagina delle specifiche del metodo ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind ) nel caso in cui sia necessario utilizzarlo nei browser in cui non è supportato (in pratica IE <8 ... quindi nel mio libro IE8 è l'unico browser che supporto che non lo ha in modo nativo).

Infine, non prendere in considerazione l’idea di includere un’intera libreria solo perché è necessaria una delle sue funzioni.

AFAIK, C’è una leggera differenza tra bind e proxy, che può essere molto importante se si utilizza jQuery. Function.prototype.bind restituisce sempre un nuovo puntatore di funzione. jQuery.proxy restituisce solo una nuova funzione se non è già stato creato un proxy degli stessi argomenti. Non che tu voglia farlo in questo modo, ma:

$(elm).on('click', doStuff.bind(thing)); //adds event handler $(elm).off('click', doStuff.bind(thing)); //does not remove event handler as 2nd call of doStuff.bind(thing) always returns a new/different function $(elm).on('click', $.proxy(doStuff, thing)); //adds handler $(elm).off('click', $.proxy(doStuff, thing));//DOES remove handler, as a second call to $.proxy(doStuff, thing) is smart enough to know about similar use-cases //Likewise, if you just passed 'thing.doStuff()' into the $.off() method, it would also work