Saya baru mengenal underscore.js. Apa tujuan dari [context]
di _.each()
? Bagaimana cara menggunakannya?
162
Saya baru mengenal underscore.js. Apa tujuan dari [context]
di _.each()
? Bagaimana cara menggunakannya?
Parameter konteks hanya menetapkan nilai this
dalam fungsi iterator.
var someOtherArray = ["name","patrick","d","w"];
_.each([1, 2, 3], function(num) {
// In here, "this" refers to the same Array as "someOtherArray"
alert( this[num] ); // num is the value from the array being iterated
// so this[num] gets the item at the "num" index of
// someOtherArray.
}, someOtherArray);
Contoh Kerja: http://jsfiddle.net/a6Rx4/
Ia menggunakan nomor dari setiap anggota Array yang di-iterasi untuk mendapatkan item pada indeks tersebut someOtherArray
, yang diwakili oleh this
sejak kami memberikannya sebagai parameter konteks.
Jika Anda tidak mengatur konteksnya, maka this
akan merujuk ke window
objek.
someOtherArray[num]
bukanthis[num]
?context
adalah di manathis
mengacu pada fungsi iterator Anda. Sebagai contoh:sumber
Konteksnya memungkinkan Anda memberikan argumen saat panggilan berlangsung, memungkinkan penyesuaian mudah dari fungsi pembantu umum yang dibuat sebelumnya.
beberapa contoh:
Bahkan dari contoh terbatas, Anda dapat melihat betapa dahsyatnya "argumen tambahan" dapat untuk membuat kode yang dapat digunakan kembali. Alih-alih membuat fungsi panggilan balik yang berbeda untuk setiap situasi, Anda biasanya dapat mengadaptasi pembantu tingkat rendah. Tujuannya adalah agar logika kustom Anda menggabungkan kata kerja dan dua kata benda, dengan pelat ketel minimum.
Memang, fungsi panah telah menghilangkan banyak "kode golf" keunggulan fungsi murni generik, tetapi keunggulan semantik dan konsistensi tetap.
Saya selalu menambahkan
"use strict"
bantuan untuk memberikan[].map()
kompatibilitas asli ketika melewati primitif. Kalau tidak, mereka dipaksa menjadi objek, yang biasanya masih berfungsi, tetapi lebih cepat dan aman untuk menjadi tipe spesifik.sumber
Penggunaan _.each secara mudah
Inilah contoh sederhana yang dapat digunakan
_.each
:Keluaran:
Alih-alih menelepon
addItem
beberapa kali, Anda dapat menggunakan garis bawah dengan cara ini:yang identik dengan memanggil
addItem
tiga kali berurutan dengan barang-barang ini. Pada dasarnya itu array Anda dan untuk setiap item memanggil fungsi panggilan balik anonim Anda yang memanggilx.addItem(item)
. Fungsi panggilan balik anonim mirip denganaddItem
fungsi anggota (misalnya mengambil item) dan agak tidak berguna. Jadi, alih-alih melalui fungsi anonim, lebih baik_.each
menghindari tipuan ini dan meneleponaddItem
langsung:tetapi ini tidak akan berfungsi, karena
addItem
fungsi anggota di dalam keranjangthis
tidak akan merujuk kex
keranjang yang Anda buat. Itu sebabnya Anda memiliki opsi untuk meneruskan keranjang Andax
untuk digunakan sebagai[context]
:Contoh lengkap yang menggunakan _.each dan konteks:
Singkatnya, jika fungsi panggilan balik yang Anda
_.each
gunakan menggunakan cara apa punthis
maka Anda perlu menentukan apa yangthis
harus dirujuk di dalam fungsi panggilan balik Anda. Mungkin tampak sepertix
berlebihan dalam contoh saya, tetapix.addItem
hanya sebuah fungsi dan bisa sama sekali tidak terkait denganx
ataubasket
atau objek lain, misalnya :Dengan kata lain, Anda mengikat beberapa nilai ke
this
dalam panggilan balik Anda, atau Anda juga dapat menggunakan mengikat secara langsung seperti ini:Secara umum, jika beberapa
underscorejs
metode mengambil fungsi panggilan balik dan jika Anda ingin panggilan balik itu dipanggil pada beberapa fungsi anggota dari beberapa objek (misalnya fungsi yang menggunakanthis
) maka Anda dapat mengikat fungsi itu ke beberapa objek atau meneruskan objek itu sebagai[context]
parameter dan itu niat utama. Dan di bagian atas dokumentasi underscorejs, itulah yang mereka nyatakan: Iteratee terikat ke objek konteks, jika satu dilewatkansumber
Seperti yang dijelaskan dalam jawaban lain,
context
apakahthis
konteks yang akan digunakan dalam callback diteruskan keeach
.Saya akan menjelaskan ini dengan bantuan kode sumber metode yang relevan dari kode sumber garis bawah
Definisi
_.each
atau_.forEach
adalah sebagai berikut:Pernyataan kedua penting untuk diperhatikan di sini
Di sini,
context
diteruskan ke metode lainoptimizeCb
dan fungsi yang dikembalikan darinya kemudian ditugaskaniteratee
yang kemudian disebut.Seperti dapat dilihat dari definisi metode di atas
optimizeCb
, jikacontext
tidak lulus makafunc
dikembalikan sebagaimana adanya. Jikacontext
dilewati, fungsi panggilan balik disebut sebagaifunc
dipanggil dengancall()
yang digunakan untuk memanggil metode dengan mengaturthis
konteksnya. Jadi, ketikathis
digunakan di dalamfunc
, itu akan merujukcontext
.Anda dapat mempertimbangkan
context
sebagai parameter opsional terakhirforEach
dalam JavaScript.sumber