En el pasado, puede haber establecido self = this o that = this, etc., que, por supuesto, funcionará, pero usar function.prototype.bind () será mejor y se verá más profesional.
Aquí hay un ejemplo simple:
La copia del código es la siguiente:
var myobj = {
SpecialFunction: functer () {
},
AnotherspecialFunction: function () {
},
getAsyncData: function (CB) {
cb ();
},
render: function () {
var que = esto;
this.getAsyncData (function () {
eso.specialFunction ();
eso. AnotherspecialFunction ();
});
}
};
myobj.render ();
En este ejemplo, para mantener el contexto myobj, una variable que se establece, que funciona, pero no se ve ordenada sin usar function.prototype.bind ()::
La copia del código es la siguiente:
render: function () {
this.getAsyncData (function () {
this.SpecialFunction ();
this.anotherspecialFunction ();
} .bind (this));
}
Al llamar a .bind (), simplemente creará una nueva función y pasará esto a esta función. El código que implementa .bind () es más o menos así:
Copie el código de la siguiente manera: function.prototype.bind = function (scope) {
var fn = this;
Función de retorno () {
regresar fn.apply (alcance);
};
}
Aquí hay un ejemplo simple de usar function.prototype.bind ():
La copia del código es la siguiente:
var foo = {
X: 3
};
var bar = function () {
console.log (this.x);
};
bar ();
var boundfunc = bar.bind (foo);
Boundfunc ();
¿No es muy útil? Desafortunadamente, los navegadores de IE debajo de IE8 y debajo no admiten function.prototype.bind (). Los navegadores compatibles incluyen Chrome 7+, Firefox 4.0+, IE 9+, Opera 11.60+, Safari 5.1.4+. Aunque IE 8/7/6 y otros navegadores no lo admiten, el grupo de desarrollo de Mozilla escribió una función con funciones similares para la versión anterior del navegador IE, con el código de la siguiente manera:
La copia del código es la siguiente:
if (! function.prototype.bind) {
Function.prototype.bind = function (othis) {
if (typeof this! == "función") {
// Lo más cercano posible para la función ISCALLABLE ISCALLABLE DE ECMAScript 5
tirar nuevo typeError ("function.prototype.bind: lo que está tratando de estar atado no es llamable");
}
var aargs = array.prototype.slice.call (argumentos, 1),
ftobind = esto,
fnop = function () {},
fbound = function () {
devolver fTobind.apply (esta instancia de fnop && othis
? este
: othis,
aargs.concat (array.prototype.slice.call (argumentos)));
};
fnop.prototype = this.prototype;
fbound.prototype = new Fnop ();
regresar fbound;
};
}