Saya sentiasa kabur tentang perkara yang berkaitan dengan ini, seperti panggilan, memohon, dsb. Kali ini saya melihat soalan ujian bertulis berkaitan bind, jadi saya menulis artikel ini sebagai peringatan.
Bind, seperti memanggil dan memohon, boleh menukar ini yang ditunjukkan oleh konteks. Perbezaannya ialah panggilan, seperti apply, merujuk terus kepada kaedah, manakala bind mengembalikan kaedah selepas mengikat ini, tetapi teras dalaman masih digunakan.
Lihat terus pada contoh:
var obj = {
a: 1,
b: 2,
getCount: fungsi(c, d) {
Kembalikan ini.a ini.b c d;
}
};
window.a = window.b = 0;
console.log(obj.getCount(3, 4)); // 10
var func = obj.getCount;
console.log(func(3, 4)); // 7
Mengapa ini berlaku? Kerana ini dalam konteks func ialah window! Kewujudan bind adalah untuk menukar penunjuk ini untuk mendapatkan nilai yang dikehendaki:
var obj = {
a: 1,
b: 2,
getCount: fungsi(c, d) {
Kembalikan ini.a ini.b c d;
}
};
window.a = window.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
Bind ialah kaedah pelanjutan fungsi fungsi Selepas bind, kod itu mengikat semula penunjuk ini (obj) di dalam func, tetapi ia tidak serasi dengan ie6~8 Kod yang serasi adalah seperti berikut:
var obj = {
a: 1,
b: 2,
getCount: fungsi(c, d) {
Kembalikan ini.a ini.b c d;
}
};
Function.prototype.bind = Fungsi.prototype.bind ||
var itu = ini;
kembalikan fungsi() {
// console.log(arguments); // konsol [3,4] jika ie<6-8>
Kembalikan that.apply(context, arguments);
}
}
window.a = window.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
Malah, pada pendapat saya, teras bind adalah untuk mengembalikan kaedah yang tidak dilaksanakan Jika anda menggunakan apply atau call terus:
var ans = obj.getCount.apply(obj, [3, 4]);
console.log(ans); // 10
Adalah mustahil untuk menggunakan pembina fungsi func yang disingkat, jadi gunakan bind untuk lulus penunjuk ini, dan kemudian kembalikan kaedah yang tidak dilaksanakan Pelaksanaannya agak bijak.