No passado, você pode ter definido eu = isso ou aquilo = isso, etc., que obviamente funcionará, mas usando function.prototype.bind () será melhor e parecerá mais profissional.
Aqui está um exemplo simples:
A cópia do código é a seguinte:
var myobj = {
SpecialFunction: function () {
},
ANOTHERSPECIALFUNCION: function () {
},
getasyncdata: function (cb) {
cb ();
},
render: function () {
var que = this;
this.getasyncdata (function () {
that.specialFunction ();
that.antherspecialfunction ();
});
}
};
myobj.render ();
Neste exemplo, para manter o contexto myobj, uma variável que = isso é definido, que funciona, mas não parece arrumado sem usar function.prototype.bind ():
A cópia do código é a seguinte:
render: function () {
this.getasyncdata (function () {
this.SpecialFunction ();
this.antherspecialfunction ();
} .bind (this));
}
Ao chamar .bind (), ele simplesmente criará uma nova função e passará a essa função. O código que implementa .bind () é aproximadamente assim:
Copie o código da seguinte forma: function.prototype.bind = function (escopo) {
var fn = this;
Return function () {
retornar fn.Apply (escopo);
};
}
Aqui está um exemplo simples de usar function.prototype.bind ():
A cópia do código é a seguinte:
var foo = {
X: 3
};
var bar = function () {
console.log (this.x);
};
bar (); // indefinido
var boundfunc = bar.bind (foo);
Boundfunc ();
Não é muito útil? Infelizmente, os navegadores do IE abaixo do IE8 e abaixo não suportam função.prototype.bind (). Os navegadores suportados incluem Chrome 7+, Firefox 4.0+, IE 9+, Opera 11.60+, Safari 5.1.4+. Embora o IE 7/7/6 e outros navegadores não o apoie, o grupo de desenvolvimento Mozilla escreveu uma função com funções semelhantes para a versão antiga do navegador do IE, com o código da seguinte forma:
A cópia do código é a seguinte:
if (! function.prototype.bind) {
Function.prototype.bind = function (Othis) {
if (type of this! == "function") {
// coisa mais próxima possível do Ecmascript 5 Função IsCallable Interna
lança o novo TypeError ("function.prototype.bind - o que está tentando ser amarrado não é chamável");
}
var aargs = array.prototype.slice.call (argumentos, 1),
ftobind = this,
fnop = function () {},
fbound = function () {
Retorne ftobind.Apply (esta instância de fnop && othis
? esse
: Othis,
aargs.concat (array.prototype.slice.call (argumentos)));
};
fnop.prototype = this.prototype;
fbound.prototype = new FNOP ();
retornar fbound;
};
}