Saya sudah mencoba yang berikut ini tanpa hasil:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
Dalam fungsi a, saya dapat menggunakan kata kunci argumen untuk mengakses array argumen, dalam fungsi b ini hilang. Apakah ada cara meneruskan argumen ke fungsi javascript lain seperti yang saya coba lakukan?
javascript
Anders Nygaard
sumber
sumber
arguments
bukan array (melainkan objek yang mengimplementasikan semantik mirip array ) dan oleh karena itu tidak sepenuhnya jelas pada pandangan pertama apakah dapat digunakan dengan cara yang sama seperti array aktual.Jawaban:
Gunakan
.apply()
untuk memiliki akses yang sama kearguments
dalam fungsib
, seperti ini:Anda dapat mengujinya di sini .
sumber
var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
apply
seperti ini mungkin mengacaukan ruang lingkupb
(jika itu beberapa fungsi bagian dalam objek misalnya)Operator yang tersebar
ECMAScript ES6 menambahkan operator baru yang memungkinkan Anda melakukan ini dengan cara yang lebih praktis: ... Sebarkan Operator .
Contoh tanpa menggunakan
apply
metode:Note Cuplikan ini mengembalikan kesalahan sintaksis jika peramban Anda masih menggunakan ES5.
Catatan editor: Karena snippet digunakan
console.log()
, Anda harus membuka konsol JS browser Anda untuk melihat hasilnya - tidak akan ada hasil dalam halaman.Ini akan menampilkan hasil ini:
Singkatnya, operator spread dapat digunakan untuk tujuan yang berbeda jika Anda menggunakan array, sehingga juga dapat digunakan untuk argumen fungsi, Anda dapat melihat contoh serupa dijelaskan dalam dokumen resmi: Parameter rest
sumber
...args
dalama
fungsinya. Anda bisa membuat fungsi tanpa argumen dan meneruskannyab
dengan...arguments
...args
sebagaia
's masukan dapat menjadi penting jika Anda memiliki fungsi bersarang.Penjelasan bahwa tidak ada jawaban perlengkapan lainnya adalah bahwa argumen asli yang masih tersedia, tetapi tidak dalam posisi asli di
arguments
objek.The
arguments
objek berisi satu elemen untuk setiap parameter yang sebenarnya disediakan untuk fungsi. Ketika Anda menelepona
Anda menyediakan tiga argumen: nomor1
,2
dan,3
. Jadi,arguments
berisi[1, 2, 3]
.Ketika Anda memanggil
b
, namun, Anda lulus tepat satu argumen:a
'sarguments
objek. Jadiarguments
mengandung[[1, 2, 3]]
(yaitu satu elemen, yaitua
'sarguments
objek, yang memiliki sifat yang berisi argumen asli untuka
).Seperti yang ditunjukkan @Nick, Anda dapat menggunakan
apply
untuk menyediakanarguments
objek yang ditetapkan dalam panggilan.Berikut ini mencapai hasil yang sama:
Tetapi
apply
apakah solusi yang benar dalam kasus umum.sumber
this
keapply
?coba ini
sumber