Di masa lalu, Anda mungkin telah menetapkan diri = ini atau itu = ini, dll., Yang tentu saja akan berhasil, tetapi menggunakan function.prototype.bind () akan lebih baik dan akan terlihat lebih profesional.
Berikut adalah contoh sederhana:
Salinan kode adalah sebagai berikut:
var myobj = {
fungsi khusus: function () {
},
Anotherspecialfunction: function () {
},
getAsyncdata: function (cb) {
CB ();
},
render: function () {
var itu = ini;
this.getAsyncData (function () {
itu.specialfunction ();
itu.anotherspecialfunction ();
});
}
};
myobj.render ();
Dalam contoh ini, untuk mempertahankan konteks myobj, variabel yang = ini diatur, yang berfungsi, tetapi tidak terlihat rapi tanpa menggunakan function.prototype.bind ():
Salinan kode adalah sebagai berikut:
render: function () {
this.getAsyncData (function () {
this.specialfunction ();
this.anotherspecialfunction ();
} .bind (ini));
}
Saat memanggil .Bind (), itu hanya akan membuat fungsi baru dan meneruskan ini ke fungsi ini. Kode yang mengimplementasikan .bind () kira -kira seperti ini:
Salin kode sebagai berikut: function.prototype.bind = function (scope) {
var fn = ini;
return function () {
return fn.Apply (SCOPE);
};
}
Berikut ini adalah contoh sederhana menggunakan fungsi.prototype.bind ():
Salinan kode adalah sebagai berikut:
var foo = {
X: 3
};
var bar = function () {
console.log (this.x);
};
bar ();
var boundfunc = bar.bind (foo);
Boundfunc ();
Bukankah itu sangat berguna? Sayangnya, IE browser di bawah IE8 dan di bawah ini tidak mendukung fungsi.prototype.bind (). Browser yang didukung termasuk Chrome 7+, Firefox 4.0+, IE 9+, Opera 11.60+, Safari 5.1.4+. Meskipun IE 8/7/6 dan browser lainnya tidak mendukungnya, Grup Pengembangan Mozilla menulis fungsi dengan fungsi yang sama untuk versi lama browser IE, dengan kode sebagai berikut:
Salinan kode adalah sebagai berikut:
if (! function.prototype.bind) {
Function.prototype.bind = function (othis) {
if (typeof ini! == "function") {
// Hal terdekat yang mungkin terjadi dengan fungsi ecmascript 5 internal iscallable internal
Throw New TypeError ("function.prototype.bind - Apa yang mencoba terikat tidak dapat dipanggil");
}
var aargs = array.prototype.slice.call (argumen, 1),
ftobind = ini,
fnop = function () {},
fbound = function () {
return ftobind.Apply (instance ini dari fnop && othis
? ini
: Othis,
aargs.concat (array.prototype.slice.call (argumen)));
};
fnop.prototype = this.prototype;
fbound.prototype = fnop baru ();
kembali fbound;
};
}