Pertama kali saya menerjemahkan artikel teknis, saya menertawakan Anda!
Teks asli yang diterjemahkan:
Function.Apply dan function.call di JavaScript
Paragraf pertama dihilangkan.
Setiap fungsi JavaScript memiliki banyak metode terlampir, termasuk tostring (), call () dan apply (). Sepertinya Anda akan merasa aneh bahwa suatu fungsi mungkin memiliki metode sendiri, tetapi ingat bahwa setiap fungsi dalam JavaScript adalah objek. Lihatlah artikel ini dan tinjau fitur JavaScript (penyegaran). Anda mungkin juga ingin mengetahui perbedaan antara fungsi dan metode dalam JavaScript. Saya pikir deskripsi "fungsi" dan "metode" hanyalah konvensi kebiasaan JavaScript. Fungsi didasarkan pada diri mereka sendiri (misalnya: peringatan ()), dan metode adalah atribut suatu objek di dalam fungsi (kamus), dan kami memanggil metode melalui objek. Setiap objek JavaScript memiliki metode tostring (). Berikut ini adalah contoh kode. Dalam objek fungsi, kita dapat menggunakan metode tostring ().
function foo () {alert ('x');} alert (foo.toString ());Karena fungsi adalah objek, mereka memiliki sifat dan metode mereka sendiri. Kita bisa menganggapnya sebagai data. Dalam artikel ini, kami hanya fokus pada metode dua fungsi berlaku () dan call ().
Mari kita mulai dengan kode berikut:
var x = 10; fungsi f () {waspada (this.x);} f ();Kami mendefinisikan fungsi global f (). f () mengakses variabel x melalui kata kunci ini, tetapi harus dicatat bahwa kita tidak dapat menyebut fungsi ini melalui instance suatu objek. Objek apa yang menunjuk ke arah ini? Ini akan menunjukkan objek global ini. Variabel X kami didefinisikan dalam objek global ini. Kode di atas dapat berjalan secara normal. Hasil yang berjalan akan menampilkan kotak dialog, dan 10 ditampilkan di kotak dialog.
Kita dapat menelepon panggilan () dan menerapkan () melalui ini. Sebagai contoh berikut menunjukkan cara menggunakan panggilan ():
var x = 10; var o = {x: 15}; fungsi f () {waspada (this.x);} f (); f.call (o);Pertama, memanggil f () akan menampilkan kotak dialog 10, karena titik ini ke objek global saat ini. Kemudian kami memanggil metode Call () dari fungsi F, parameter yang dilewati adalah O, dan hasil run menunjukkan nilai atribut X dalam O 15. Metode Call () akan menggunakan parameter pertamanya sebagai penunjuk ini ke fungsi F. Artinya, kami akan memberi tahu runtime mana objek ini dalam fungsi F menunjuk ke.
Lompatan ini terdengar agak lucu, dan bahkan anomali untuk c ++, java, dan c# programmer. Ini semua adalah bagian ecmascript yang menarik.
Anda juga dapat meneruskan parameter ke fungsi melalui panggilan ():
var x = 10; var o = {x: 15}; fungsi f () {waspada (this.x);} f (); f.call (o);apply () dan call () serupa, kecuali yang berlaku () mensyaratkan bahwa parameter kedua harus berupa array. Array ini akan disahkan sebagai argumen ke fungsi target.
var x = 10; var o = {x: 15}; function f (pesan) {alert (pesan); waspada (this.x);} f ('memohon f'); f.Apply (o, ['memohon f melalui apply']);Metode Apply () berguna karena kita dapat membuat fungsi tanpa peduli dengan parameter metode target. Fungsi ini dapat melewati parameter tambahan ke metode ini melalui parameter array kedua Apply ().
var o = {x: 15}; fungsi f1 (pesan1) {waspada (pesan1 + this.x);} function f2 (message1, message2) {waspada (pesan1 + (this.x * this.x) + pesan2);} g (objek, fungsi, args) {func.apply (objek, args);}; ['Nilai x kuadrat =', '.Ada yang salah dengan sintaks ini. Untuk memanggil metode Apply (), kami memaksa fungsi objektif untuk menggunakan parameter dalam array. Untungnya, ada cara untuk membuat sintaks ini lebih mudah. Sebelum ini, pertama -tama kita harus memperkenalkan satu: pengidentifikasi parameter.
Dalam JavaScript, setiap fungsi sebenarnya memiliki daftar parameter panjang variabel. Ini berarti bahwa bahkan jika suatu fungsi hanya memiliki satu parameter, kita dapat meneruskan 5 parameter untuk itu. Kode berikut tidak akan memiliki kesalahan, dan hasilnya menunjukkan "h".
fungsi f (pesan) {waspada (pesan);} f ('h', 'e', 'l', 'l', 'o');Dalam f (), jika kita tidak ingin menerima parameter lain, kita dapat menggunakan argumen kata kunci. Argumen mewakili objek argumen, yang memiliki atribut yang mewakili panjang yang mirip dengan array.
fungsi f (pesan) {// nilai pesan sama dengan argumen [0] untuk (var i = 1; i <arguments.length; i ++) {pesan+= argumen [i]; } peringatan (pesan);} // hasilnya menunjukkan "halo" f ('h', 'e', 'l', 'l', 'o');Anda harus tahu bahwa secara ketat, argumen bukan array. Argumen memiliki atribut panjang, tetapi tidak ada metode split, dorong, dan pop. Dalam fungsi g () sebelumnya, kita dapat menyalin parameter yang diperlukan dari argumen, membentuk array, dan kemudian lewati array ini untuk diterapkan ().
var o = {x: 15}; function f (message1, message2) {alert (message1 + (this.x * this.x) + message2);} function g (objek, func) {// argumen [0] = objek // argumen [1] = func var args = []; untuk (var i = 2; i <arguments.length; i ++) {args.push (argumen [i]); } func.Apply (objek, args);} g (o, f, 'Nilai x kuadrat =', '. Wow!');Ketika kita memanggil g (), kita dapat meneruskan argumen tambahan sebagai parameter alih -alih memasukkan argumen ke dalam array.