Dalam JavaScript, titik ini berubah secara dinamis, dan sangat mungkin bahwa titik ini dihancurkan secara tidak sengaja selama proses penulisan program. Oleh karena itu, kita membutuhkan teknologi yang dapat memperbaiki arti dari ini, jadi kita memiliki tiga metode: panggilan, terapkan dan berikatan untuk mengubah titik ini di dalam tubuh fungsi, karena fungsi memiliki konsep "konteks definisi", "konteks runtime" dan "konteks dapat diubah"
Terapkan, hubungi
Terapkan: Terapkan satu metode objek tertentu dan ganti objek saat ini dengan objek lain
Panggilan: Panggil metode objek untuk mengganti objek saat ini dengan objek lain
function person () {} person.prototype = {attr: {usia: 18, sex: 'girl'}, katakanlah: function () {console.log ("Usia saya adalah" + this.attr.age); console.log ("Saya adalah" + this.attr.sex); }} var Marry = orang baru (); Marry.say (); // usia saya berusia 18 // saya seorang gadisUbah arah
function person () {} person.prototype = {attr: {usia: 18, sex: 'girl'}, katakanlah: function () {console.log ("Usia saya adalah" + this.attr.age); console.log ("Saya adalah" + this.attr.sex); }} xiaoming = {attr: {usia: 20, sex: 'boy'}}; var Marry = orang baru (); Marry.say (); Marry.say.call (xiaoming); // Usia saya berusia 18 // Saya seorang perempuan // usia saya berusia 20 // saya seorang anak laki -lakiApa yang umum
Keduanya dapat digunakan untuk memanggil metode alih -alih objek lain, mengubah konteks objek fungsi dari konteks awal ke objek baru yang ditentukan oleh ThisoBJ.
Perbedaannya
1. Terapkan: Hanya ada dua parameter paling banyak - objek ini dan array argarray yang baru. Jika Anda meneruskan beberapa parameter ke metode ini, maka tuliskan semua parameter ke dalam array ini. Tentu saja, bahkan jika hanya ada satu parameter, itu harus ditulis ke dalam array. Jika Argarray bukan array yang valid atau bukan objek argumen, tipeError akan dihasilkan. Jika tidak ada argumen yang disediakan, objek global akan digunakan sebagai hal ini dan tidak dapat disahkan argumen apa pun.
fun.call (thisarg [, arg1 [, arg2 [, ...]]]) fungsi f (x, y) {console.log (x+y);} f.call (null, 1, 1) // return 22. Call: Ini adalah daftar parameter langsung, yang terutama digunakan ketika berbagai metode objek JS dipanggil satu sama lain, sehingga penunjuk saat ini tetap konsisten, atau dalam kasus khusus, penunjuk ini perlu diubah. Jika parameter ini tidak disediakan, objek global digunakan sebagai ThisOBJ.
fun.apply (thisarg, [argsarray]) fungsi f (x, y) {console.log (x+y);} f.call (null, [1,1]) // return 2Terapkan sama dengan fungsi panggilan, kecuali bahwa daftar parameter yang masuk berbeda dalam bentuk. Thisarg adalah konteks yang ingin Anda tentukan. Ini bisa berupa objek JavaScript (semua yang ada di JavaScript adalah objek). Panggilan perlu meneruskan parameter secara berurutan, saat menerapkan parameter menempatkan dalam array.
Jika jumlah parameter suatu fungsi tidak diperbaiki, gunakan panggilan ketika parameter Anda dengan jelas tahu jumlahnya, dan gunakan berlaku ketika tidak pasti, dan kemudian dorong parameter ke dalam array dan lewati. Ketika jumlah parameter tidak pasti, fungsi juga dapat melintasi semua parameter melalui array argumen. Mari kita lihat beberapa penggunaan
Kode 1
var array1 = [12, "foo", {name: "joe"}, -2458]; var array2 = ["doe", 555, 100]; array.prototype.push.Apply (array1, array2); console.log (array1); // [12, "foo", objek, -24, "do," do, "do, -a",Kode dua
var angka = [5, 458, 120, -215]; Math.max.Apply (null, angka); // 458
Kode tiga
log (12, "foo", {name: "joe"}, -2458); function log () {var args = array.prototype.slice.call (argumen); args.unshift ('(app)'); console.log.Apply (konsol, args);}; // (app) 12 objek foo {name: "joe"} -2458mengikat
fun.bind (thisarg [, arg1 [, arg2 [, ...]]]))
Berbeda di atas, BIND akan mengembalikan fungsi baru yang mengubah titik ini. Perhatikan bahwa fungsi baru ditekankan di sini, yang bukan alamat memori yang sama dengan yang digunakan sebelumnya, jadi ketika Anda perlu menggunakan kembali fungsi ini, Anda harus menyimpannya ke variabel untuk memfasilitasi panggilan berikutnya. Dua fungsi di atas adalah hasil eksekusi yang dikembalikan, yaitu panggilan dieksekusi.
Baris, Selain itu, hal lain yang perlu diperhatikan adalah bahwa parameter pertama dalam fungsi BIND akan secara otomatis menjadi nilai default untuk mengembalikan parameter dalam fungsi baru. Kemudian ketika panggilan resmi dipanggil, Anda hanya perlu memberikan parameter yang tersisa kecuali parameter pertama.
fungsi f (x, y) {console.log (x+y);} f.call (null, [1,1]) var new_f = f.bind (null, 1,1) // return new functionNew_f (1) // return 2Perlu dicatat bahwa parameter ThisArg di semua contoh kode di atas digantikan oleh nol. Ketika objek Thisarg tidak ditentukan, titik ini adalah objek global di bawah nol dan tidak terdefinisi, yaitu, lingkungan eksekusi kode JS
Terapkan, panggil, bind perbandingan
var obj = {bar: 'oops, ini adalah ide yang buruk'}; var foo = {get: function () {return this.bar; }} var bind = foo.get.bind (obj), call = foo.get.call (obj), apply = foo.get.Apply (obj); console.log (bind (), panggilan, berlaku); Console.log (Bind, Call, Ajukan); console.log (typeof bind, tipe panggilan, typeof apply); console.log (typeof bind (), tipe panggilan, tipe apply);Saya tidak melihat perbedaan. Perbedaannya adalah bahwa ketika Anda ingin mengubah konteks, itu tidak segera dieksekusi, tetapi panggilan balik dieksekusi, gunakan metode Bind (). Terapkan/Panggilan akan segera menjalankan fungsi
Terapkan, Panggilan, Bind semuanya digunakan untuk mengubah titik objek fungsi ini; Parameter pertama dari Apply, Call, Bind adalah semua objek yang seharusnya menunjuknya, yaitu, konteks yang akan ditentukan; Terapkan, Panggilan, Bind semuanya dapat menggunakan parameter selanjutnya untuk meneruskan parameter; Bind mengembalikan fungsi yang sesuai, yang nyaman untuk menelepon nanti; Terapkan, Panggilan Dipanggil Segera
Artikel di atas sangat memahami perbedaan antara panggilan, berlaku, dan mengikat metode dalam JavaScript adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.