Shim ES5 para funções de ligação é Javascript
Pergunta
Abaixo está um calço ES5 para ligação JS. auto.apply na função vinculada.Eu sei como usar o método apply, mas onde está auto apontando neste caso?Era para ser um
função, mas aqui auto parece um objeto.
if ( !Function.prototype.bind ) {
Function.prototype.bind = function( obj ) {
var slice = [].slice,
args = slice.call(arguments, 1),
self = this,
nop = function () {},
bound = function () {
return self.apply( this instanceof nop ? this : ( obj || {} ), // self in this line is supposed
to // represent a function ?
args.concat( slice.call(arguments) ) );
};
nop.prototype = self.prototype;
bound.prototype = new nop();
return bound;
};
}
Solução
Tenha em mente que em javascript quase tudo é um objeto.
Então você tem isso aí:
eu = isso
Então, o eu não é representando qualquer coisa, eu mesmo é a instância.
Outras dicas
self
está sendo usado no calço que você listou para acomodar o fato de que this
mudanças junto com mudanças de escopo.Dentro do escopo direto da função Function.prototype.bind this
se referirá ao objeto no qual a função de ligação foi chamada.
Depois de inserir o escopo do aninhado bound
função this
mudou;então o autor atribuiu self = this
dentro do bind
função para permitir o valor de this
no momento bind
é chamado a permanecer disponível para o bound
função por meio de escopo lexical (fechamento).
A definição do escopo em JavaScript pode ser bastante complicada;para uma explicação detalhada, dê uma olhada neste artigo.