Dans le passé, vous pourriez avoir défini Self = ceci ou ceci = ceci, etc., ce qui fonctionnera bien sûr, mais en utilisant function.prototype.bind () sera mieux et il sera plus professionnel.
Voici un exemple simple:
La copie de code est la suivante:
var myobj = {
SpecialFunction: function () {
},
AnothersPecalFunction: function () {
},
getasyncdata: fonction (cb) {
CB ();
},
rendu: fonction () {
var that = this;
this.getasyncdata (function () {
that.specialFunction ();
que.anothers encialFunction ();
});
}
};
myobj.render ();
Dans cet exemple, pour maintenir le contexte MYOBJ, une variable qui = ceci est définie, ce qui fonctionne, mais il ne semble pas bien rangé sans utiliser function.prototype.bind ():
La copie de code est la suivante:
rendu: fonction () {
this.getasyncdata (function () {
this.specialFunction ();
this.anothers encialFunction ();
} .bind (this));
}
Lors de l'appel .bind (), il créera simplement une nouvelle fonction et passera cela à cette fonction. Le code qui implémente .bind () est à peu près comme ceci:
Copiez le code comme suit: function.prototype.bind = fonction (scope) {
var fn = this;
return function () {
retour fn.apply (portée);
};
}
Voici un exemple simple d'utilisation de function.prototype.bind ():
La copie de code est la suivante:
var foo = {
x: 3
};
var bar = function () {
console.log (this.x);
};
bar (); //
var boundfunc = bar.bind (foo);
BoundFunc ();
N'est-ce pas très utile? Malheureusement, les navigateurs IE ci-dessous IE8 et ci-dessous ne prennent pas en charge la fonction.prototype.bind (). Les navigateurs pris en charge incluent Chrome 7+, Firefox 4.0+, IE 9+, Opera 11.60+, Safari 5.1.4+. Bien que IE 8/7/6 et d'autres navigateurs ne le prennent pas en charge, le groupe de développement de Mozilla a écrit une fonction avec des fonctions similaires pour l'ancienne version du navigateur IE, avec le code comme suit:
La copie de code est la suivante:
if (! function.prototype.bind) {
Function.prototype.bind = fonction (othis) {
if (typeof this! == "function") {
// chose la plus proche possible de la fonction ISCallable interne ECMAScript 5
lancer un nouveau typeError ("function.prototype.bind - ce qui essaie d'être lié n'est pas appelant");
}
var aargs = array.prototype.slice.call (arguments, 1),
ftobind = ceci,
fnop = function () {},
fbound = function () {
return ftobind.apply (cette instance de fnop && othis
? ce
: othis,
aargs.concat (array.prototype.slice.call (arguments)));
};
fnop.prototype = this.prototype;
fbound.prototype = new fnop ();
retour fbound;
};
}