Saya sudah tahu itu apply
dan call
fungsi serupa yang mengatur this
(konteks fungsi).
Perbedaannya adalah dengan cara kami mengirim argumen (manual vs array)
Pertanyaan:
Tetapi kapan saya harus menggunakan bind()
metode ini?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Royi Namir
sumber
sumber
call()
Anda melewati argumen secara individual danapply()
sebagai array argumen. Untuk perincian lebih lanjut, lihat dokumentasi tertaut yang seharusnya dapat menjawab pertanyaan Anda sepenuhnya.kind of weird there is not an existing question about this :
Mengenai itu. Itu mungkin karenabind()
ditambahkan setelah dua lainnya sudah ada di JavaScript 1.8.5 - ECMA-262, edisi ke-5. Sementaracall()
danapply()
telah ada sejak JavaScript 1.3 - ECMA-262 3rd Edition. SO memiliki pertanyaan pada mereka seperti: apa-perbedaan-antara-panggilan-dan-berlaku . Aku hanya menebak-nebak ketika aku bertanya-tanya sendiri.Jawaban:
Saya membuat perbandingan ini antara objek fungsi, panggilan fungsi,
call/apply
danbind
beberapa waktu yang lalu:.bind
memungkinkan Anda untuk mengaturthis
nilai sekarang sambil memungkinkan Anda untuk mengeksekusi fungsi di masa depan , karena mengembalikan objek fungsi baru.sumber
Gunakan
.bind()
ketika Anda ingin fungsi itu nanti dipanggil dengan konteks tertentu, berguna dalam acara. Gunakan.call()
atau.apply()
ketika Anda ingin menjalankan fungsi dengan segera, dan ubah konteksnya.Panggil / terapkan panggil fungsi segera, padahal
bind
mengembalikan fungsi yang, ketika nanti dieksekusi, akan memiliki konteks yang benar untuk memanggil fungsi asli. Dengan cara ini Anda dapat mempertahankan konteks dalam panggilan balik dan acara async.Saya sering melakukan ini:
Saya menggunakannya secara luas di Node.js untuk panggilan balik async yang ingin saya sampaikan metode anggota, tetapi masih ingin konteksnya menjadi contoh yang memulai tindakan async.
Implementasi bind yang sederhana dan naif akan seperti:
Ada lebih dari itu (seperti melewati argumen lain), tetapi Anda dapat membaca lebih lanjut tentang hal itu dan melihat implementasi nyata di MDN .
Semoga ini membantu.
sumber
bind
kembali.Mereka semua melampirkan ini ke dalam fungsi (atau objek) dan perbedaannya ada pada pemanggilan fungsi (lihat di bawah).
panggilan melampirkan ini ke dalam fungsi dan menjalankan fungsi segera:
bind menempelkan ini ke dalam fungsi dan harus dipanggil secara terpisah seperti ini:
atau seperti ini:
berlaku mirip dengan panggilan kecuali bahwa itu mengambil objek seperti array bukannya daftar argumen keluar satu per satu:
sumber
"use strict"
untuk menghindari mengesampingkan kata kunci yang dipesan tersebut. +1.Terapkan vs. Panggilan vs. Contoh Bind
Panggilan
Menerapkan
Mengikat
Kapan Harus Menggunakan Masing-masing
Panggilan dan terapkan sangat bisa dipertukarkan. Putuskan saja apakah lebih mudah untuk mengirim dalam array atau daftar argumen yang dipisahkan koma.
Saya selalu ingat yang mana dengan mengingat bahwa Panggilan adalah untuk koma (daftar terpisah) dan Terapkan untuk Array.
Bind sedikit berbeda. Ini mengembalikan fungsi baru. Panggilan dan Terapkan segera jalankan fungsi saat ini.
Bind sangat bagus untuk banyak hal. Kita bisa menggunakannya untuk menjelajah fungsi seperti pada contoh di atas. Kita dapat mengambil fungsi halo sederhana dan mengubahnya menjadi helloJon atau helloKelly. Kami juga dapat menggunakannya untuk acara seperti diKlik di mana kami tidak tahu kapan mereka akan dipecat tetapi kami tahu konteks apa yang kami inginkan.
Referensi: codeplanet.io
sumber
call
danapply
, apakah itu mengikuti bahwa jika Anda tidak memilikithis
di dalam metode, maka Anda akan menetapkan argumen pertama sebagainull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Bekerja dengan sangat baik dan menghasilkan VM128: 4 Halo Jon KupermanIni memungkinkan untuk mengatur nilai untuk
this
independen dari bagaimana fungsi dipanggil. Ini sangat berguna saat bekerja dengan callback:Untuk mencapai hasil yang sama dengan
call
akan terlihat seperti ini:sumber
.bind()
seperti yang Anda tunjukkan sebelumnya tidak benar. Ketika Anda menggunakanfn.bind(obj)
fungsi lain akan dikembalikan (bukan yang Anda buat sebelumnya). Dan tidak ada kemampuan untuk mengubah nilaithis
di dalambinded
fungsi. Sebagian besar ini digunakan untukthis
asuransi callback . Tetapi dalam contoh Anda - tidak ada perbedaan dalam hasilnya. Tapifn !== fn.bind(obj);
perhatikan itu.Anggaplah kita memiliki
multiplication
fungsiMari kita membuat beberapa fungsi standar menggunakan
bind
var multiby2 = multiplication.bind(this,2);
Sekarang multiby2 (b) sama dengan perkalian (2, b);
Bagaimana jika saya melewati kedua parameter dalam bind
Sekarang getSixAlways () sama dengan multiplikasi (3,2);
bahkan melewati parameter mengembalikan 6;
getSixAlways(12); //6
Ini membuat fungsi multiplikasi baru dan menetapkannya ke magicMultiplication.
Oh tidak, kami menyembunyikan fungsi multiplikasi ke dalam magicMultiplication.
panggilan
magicMultiplication
mengembalikan tanda kosongfunction b()
pada eksekusi itu berfungsi dengan baik
magicMultiplication(6,5); //30
Bagaimana dengan menelepon dan melamar?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
Dengan kata-kata sederhana,
bind
buat fungsi,call
danapply
jalankan fungsi sementaraapply
mengharapkan parameter dalam arraysumber
bind
membuat fungsi,call
danapply
mengeksekusi fungsi sementaraapply
mengharapkan parameter dalam array"Keduanya
Function.prototype.call()
danFunction.prototype.apply()
memanggil fungsi denganthis
nilai yang diberikan , dan mengembalikan nilai balik dari fungsi itu.Function.prototype.bind()
, di sisi lain, membuat fungsi baru denganthis
nilai yang diberikan , dan mengembalikan fungsi itu tanpa menjalankannya.Jadi, mari kita fungsi yang terlihat seperti ini:
Sekarang, mari kita ambil objek yang terlihat seperti ini:
Kita dapat mengikat fungsi kita ke objek kita seperti ini:
Sekarang, kita dapat menjalankan
Obj.log
di mana saja dalam kode kita:Di mana itu benar-benar menarik, adalah ketika Anda tidak hanya mengikat nilai
this
, tetapi juga untuk argumennyaprop
:Kita sekarang dapat melakukan ini:
sumber
bind : Ini mengikat fungsi dengan nilai dan konteks yang disediakan tetapi tidak menjalankan fungsi. Untuk menjalankan fungsi, Anda perlu memanggil fungsi.
panggilan : Menjalankan fungsi dengan konteks dan parameter yang disediakan.
apply : Ini mengeksekusi fungsi dengan konteks dan parameter yang disediakan sebagai array .
sumber
Berikut adalah satu artikel bagus untuk menggambarkan perbedaan di antara
bind()
,apply()
dancall()
, merangkumnya seperti di bawah ini.bind()
memungkinkan kita untuk dengan mudah mengatur objek spesifik mana yang akan terikat dengan ini ketika suatu fungsi atau metode dipanggil.bind()
izinkan kami untuk meminjam metodeSatu masalah dengan contoh ini adalah bahwa kami menambahkan metode baru
showData
padacars
objek dan kami mungkin tidak ingin melakukannya hanya dengan meminjam metode karena objek mobil mungkin sudah memiliki properti atau nama metodeshowData
. Kami tidak ingin menimpanya secara tidak sengaja. Seperti yang akan kita lihat dalam diskusi kita tentangApply
dan diCall
bawah ini, yang terbaik adalah meminjam metode menggunakan metodeApply
atauCall
.bind()
memungkinkan kita untuk menjelajah suatu fungsiFunction Currying , juga dikenal sebagai aplikasi fungsi parsial , adalah penggunaan fungsi (yang menerima satu atau lebih argumen) yang mengembalikan fungsi baru dengan beberapa argumen yang telah ditetapkan.
Kita dapat menggunakannya
bind()
untuk menjelajahgreet
fungsi iniapply()
ataucall()
untuk mengatur ini nilaiThe
apply
,call
, danbind
metode semuanya digunakan untuk menetapkan nilai ini ketika memanggil metode, dan mereka melakukannya dengan cara yang sedikit berbeda untuk memungkinkan penggunaan kontrol langsung dan keserbagunaan dalam kode JavaScript kami.Metode
apply
dancall
hampir identik ketika mengatur nilai ini kecuali bahwa Anda melewatkan parameter fungsiapply ()
sebagai array , sementara Anda harus mendaftar parameter secara individual untuk meneruskannya kecall ()
metode.Berikut adalah salah satu contoh untuk menggunakan
call
atauapply
mengatur ini dalam fungsi panggilan balik.Pinjam fungsi dengan
apply
ataucall
Metode Array Pinjam
Mari kita membuat
array-like
objek dan meminjam beberapa metode array untuk beroperasi pada objek seperti array kita.Kasus umum lainnya adalah konversi
arguments
ke array sebagai berikutPinjam metode lain
Gunakan
apply()
untuk menjalankan fungsi variabel-arityIni
Math.max
adalah salah satu contoh fungsi variabel-arity,Tetapi bagaimana jika kita memiliki sejumlah angka untuk diteruskan
Math.max
? Kami tidak bisa melakukan ini:Di sinilah
apply ()
metode ini membantu kami menjalankan fungsi variadic . Alih-alih di atas, kita harus melewati array angka menggunakanapply (
) dengan demikian:sumber
segera panggil / terapkan fungsi eksekusi:
bind tidak menjalankan fungsi dengan segera, tetapi mengembalikan fungsi apply yang dibungkus (untuk eksekusi nanti):
sumber
Sintaksis
Sini
sumber
Perbedaan mendasar antara Panggilan, Terapkan, dan Bind adalah:
Bind akan digunakan jika Anda ingin konteks eksekusi Anda muncul nanti dalam gambar.
Ex:
Katakanlah saya ingin menggunakan metode ini di beberapa variabel lain
Untuk menggunakan referensi mobil di beberapa variabel lain yang harus Anda gunakan
Mari kita bicara tentang penggunaan fungsi bind yang lebih luas
Mengapa? Karena sekarang func terikat dengan Nomor 1, jika kita tidak menggunakan mengikat dalam kasus itu akan mengarah ke Objek Global.
Panggil, Terapkan digunakan ketika Anda ingin menjalankan pernyataan pada saat yang sama.
sumber
Panggilan berlaku dan ikat. dan bagaimana mereka berbeda.
Mari belajar panggilan dan terapkan menggunakan terminologi harian apa pun.
Anda memiliki tiga mobil
your_scooter , your_car and your_jet
yang dimulai dengan mekanisme (metode) yang sama. Kami membuat objekautomobile
dengan metodepush_button_engineStart
.Mari kita mengerti kapan panggilan dan melamar digunakan. Mari kita anggap bahwa Anda adalah seorang insinyur dan Anda miliki
your_scooter
,your_car
danyour_jet
yang tidak datang dengan push_button_engine_start dan Anda ingin menggunakan pihak ketigapush_button_engineStart
.Jika Anda menjalankan baris kode berikut, mereka akan memberikan kesalahan. MENGAPA?
Jadi contoh di atas berhasil memberikan your_scooter, your_car, your_jet fitur dari objek mobil.
Mari selami lebih dalam Di sini kita akan membagi baris kode di atas.
automobile.push_button_engineStart
membantu kami mendapatkan metode yang digunakan.Selanjutnya kami menggunakan apply atau call menggunakan notasi titik.
automobile.push_button_engineStart.apply()
Sekarang terapkan dan panggil terima dua parameter.
Jadi di sini kita mengatur konteks di baris terakhir kode.
automobile.push_button_engineStart.apply(your_scooter,[20])
Perbedaan antara panggilan dan berlaku adalah hanya berlaku menerima parameter dalam bentuk array sementara panggilan hanya dapat menerima daftar argumen yang dipisahkan koma.
apa fungsi JS Bind?
Fungsi bind pada dasarnya yang mengikat konteks sesuatu dan kemudian menyimpannya ke dalam variabel untuk dieksekusi pada tahap selanjutnya.
Mari kita membuat contoh kita sebelumnya menjadi lebih baik. Sebelumnya kami menggunakan metode milik objek mobil dan menggunakannya untuk melengkapi
your_car, your_jet and your_scooter
. Sekarang mari kita bayangkan kita ingin memberikan yang terpisahpush_button_engineStart
secara terpisah untuk memulai mobil kita sendiri pada setiap tahap selanjutnya dari eksekusi yang kita inginkan.masih belum puas?
Mari kita perjelas sebagai tetesan air mata. Waktunya bereksperimen. Kami akan kembali untuk memanggil dan menerapkan aplikasi fungsi dan mencoba menyimpan nilai fungsi sebagai referensi.
Eksperimen di bawah ini gagal karena panggilan dan penerapan segera dipanggil, oleh karena itu, kami tidak pernah sampai ke tahap menyimpan referensi dalam variabel yang merupakan fungsi mengikat mencuri acara
var test_function = automobile.push_button_engineStart.apply(your_scooter);
sumber
Panggilan: panggilan memanggil fungsi dan memungkinkan Anda untuk melewati argumen satu per satu
Terapkan: Terapkan menerapkan fungsi dan memungkinkan Anda untuk melewati argumen sebagai array
Bind: Bind mengembalikan fungsi baru, memungkinkan Anda untuk meneruskan dalam array ini dan sejumlah argumen.
sumber
call (): - Di sini kita melewati argumen fungsi satu per satu, bukan dalam format array
apply (): - Di sini kita memberikan argumen fungsi dalam format array
bind (): -
sumber
Panggilan JavaScript ()
JavaScript berlaku ()
** fungsi panggil dan terapkan adalah perbedaan panggil bawa argumen terpisah tetapi terapkan take array seperti: [1,2,3] **
Binding JavaScript ()
sumber
Bayangkan, bind tidak tersedia. Anda dapat dengan mudah membangunnya sebagai berikut:
sumber
sumber
Konsep utama di balik semua metode ini adalah Function burrowing .
Fungsi meminjam memungkinkan kita untuk menggunakan metode dari satu objek pada objek yang berbeda tanpa harus membuat salinan dari metode itu dan memeliharanya di dua tempat yang terpisah. Ini dicapai melalui penggunaan. panggilan (),. berlaku (), atau. bind (), yang semuanya ada untuk secara eksplisit mengatur ini pada metode yang kita pinjam
Di bawah ini adalah contoh dari semua metode ini
PANGGILAN
MENERAPKAN
MENGIKAT
printMyNAme () adalah fungsi yang memanggil fungsi
di bawah ini adalah tautan untuk jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
sumber
Saya pikir tempat yang sama adalah: semuanya dapat mengubah nilai fungsi ini. Perbedaannya adalah: fungsi bind akan mengembalikan fungsi baru sebagai hasilnya; metode panggilan dan terapkan akan menjalankan fungsi dengan segera, tetapi berlaku dapat menerima array sebagai params, dan itu akan menguraikan array yang dipisahkan. Dan juga, fungsi bind bisa menjadi Currying.
sumber
fungsi bind harus digunakan ketika kita ingin menetapkan fungsi dengan konteks tertentu misalnya.
dalam contoh di atas jika kita memanggil fungsi demo.setValue () dan meneruskan fungsi ini.getValue secara langsung, maka ia tidak memanggil fungsi demo.setValue secara langsung karena ini dalam setTimeout merujuk ke objek jendela sehingga kita perlu meneruskan konteks objek demo ke this.getValue berfungsi menggunakan bind. itu berarti kita hanya melewati fungsi dengan konteks objek demo bukan fungsi panggilan aktif.
Semoga kamu mengerti.
untuk informasi lebih lanjut silakan lihat fungsi bav javascript tahu secara detail
sumber