Saya melihat perbedaan saat memanggil fungsi dengan tanda kurung kosong, atau tanpa tanda kurung sama sekali. Namun, saya tidak memberikan argumen apa pun ke fungsi tersebut, jadi saya bertanya-tanya, apa perbedaan antara:
window.onload = initAll();
dan
window.onload = initAll;
Tolong jelaskan prinsip di baliknya.
javascript
Dekan
sumber
sumber
(
LEFT PARENTHESIS = buka kurung (1.0) dan 0029)
RIGHT PARENTHESIS = tutup kurung (1.0) - unicode.org/charts/charindex.html#P dan apa yang Dictionary.com katakan tentangnya - dictionary.reference.com/ browse / PARENTHESIS "Salah satu atau kedua garis lengkung tegak, () ..."{}
disebut tanda kurung tupai.Jawaban:
Ini langsung dijalankan dan menetapkan nilai kembali fungsi ke . Ini biasanya bukan yang Anda inginkan. harus mengembalikan fungsi agar ini masuk akal.
initAll()
window.onload
initAll()
ini menetapkan fungsi sebenarnya ke
window.onload
- ini dimungkinkan karena dalam JavaScript, seperti yang dikatakan @Felix, fungsi adalah objek kelas satu - tanpa menjalankannya.initAll
akan dieksekusi oleh event load.sumber
Apa yang dikatakan Pekka benar, tetapi saya ingin menjelaskan sedikit dengan contoh yang akan membantu menjelaskan kepada seseorang yang tidak sepenuhnya memahami penunjuk fungsi atau delegasi.
Saya tidak akan menggunakan
window.onload
karena itu sedikit dibuat-buat untuk didemonstrasikan. Saya akan menggunakan fungsi perkalian sederhana untuk mendemonstrasikan:Ini sama-sama bisa ditulis:
Sementara di contoh pertama, implikasinya mungkin tidak jelas, contoh kedua menunjukkan lebih jelas bahwa kita menetapkan fungsi yang memiliki 2 parameter ke variabel yang dipanggil
Multiply
, dan konsep fungsi sebagai tugas ini umum di seluruh JavaScript. Ini adalah demonstrasi kecil dari fakta bahwa fungsi adalah "warga kelas satu" , artinya, dapat diedarkan persis seperti kita sedang menyebarkan nilai.Jadi sekarang untuk perbedaan tugas:
Pada titik mendefinisikan variabel ret,
Multiply
dieksekusi dan nilai kembalian ditetapkan -ret
menjadi sama dengan 12.Mari kita coba lagi dengan cara yang berbeda:
Sekarang, pada titik pendefinisian
ret
,ret
menjadiMultiply
fungsi Anda dan bukan hasil yang diperoleh dariMultiply
fungsi Anda . Panggilan keret()
akan menyebabkanMultiply
fungsi Anda dijalankan, dan Anda dapat memanggilnya persis seperti jika Anda memanggilMultiply(operator, operand)
:sama dengan
Anda telah secara efektif mengatakan bahwa Anda akan menggunakan
ret
sebagai delegasi untukMultiply()
. Saat memanggilret
, kami benar-benar mengacu padaMultiply
fungsinya.Kembali ke Anda
window.onload
. Pikirkan ini sebagai:Jadi seperti yang Anda lihat,
window.onload
adalah fungsi seperti fungsi lainnya, tidak ada yang istimewa tentangnya. Anda dapat menetapkan nilai, menetapkan fungsi, membatalkannya jika Anda mau - intinya adalah bahwa tidak ada yang lebih istimewawindow.onload
dari pada fungsi Anda sendiri. Satu-satunya hal yang sedikit berbeda adalah ia dipanggil oleh jendela saat dimuat. [Penafian: Saya tidak pernah benar-benar membatalkan fungsi jendela, jadi saya tidak yakin apakah ini akan menyebabkan dampak negatif. Seseorang akan berharap mereka memeriksa untuk melihat apakah suatu fungsi ditugaskan sebelum memanggilnya yaituif (window.onload) window.onload();
].Sekarang menyebut
initAll()
apa yang kami katakan adalah:yang mungkin juga mengatakan:
Tetapi ketika kami mengatakan
initAll
tanpa tanda kurung, yang sebenarnya kami katakan adalah: Saya ingin mengganti apa pun fungsi window.onload saya, dengan fungsi baru - yaitu saya ingin menggantinya denganinitAll
fungsi saya , sehingga setiap panggilan untukwindow.onload
menjalankaninitAll
kode.Begitu:
diganti dengan:
Jadi setiap panggilan ke
window.onload
akan menjalankaninitAll
fungsi Anda, bukan apa punwindow.onload
yang semula. Anda telah mengganti fungsi asli dengan fungsi baru Anda.Bahkan, Anda juga bisa menulis:
Contoh lain yang mungkin menunjukkan lebih baik adalah ini:
Apapun waktu itu pada saat
d
itu ditentukan akhirnya ditetapkan kecurrentTime
. Bagus, tapi itu hanya berguna jika kita ingin mengetahui jam berapa fungsi yang berisi kode itu dipanggil - yaitu pada waktu buka halaman. Bagaimana jika kita menginginkan waktu saat ini setiap saat yangcurrentTime
disebut?Perhatikan bagaimana kita sebut
b()
di kamic
dand
tugas persis seperti yang kita bisa meneleponcurrentTime()
?sumber
Fungsi dalam javascript adalah warga negara kelas satu, dan dengan demikian, dapat ditugaskan ke variabel lain atau diteruskan sebagai argumen.
Jadi, saat Anda melakukannya
Anda menyetel
onload
propertiwindow
objek untuk mereferensikaninitAll
fungsi itu sendiri.Saat kamu melakukan
Anda menyetel
onload
properti untuk menampung nilai kembalian dari initAll, karena ini akan dieksekusi di tempat pada baris itu.sumber
initAll
adalah referensi ke nilai fungsi dan operator tanda kurung ditambahkan ke nama fungsi RUNS objek fungsi ini.Jadi jika Anda melakukan sesuatu seperti
maka
a
akan menjadi sama sepertiinitAll
- misalnya Anda dapat melakukannyaa()
- tetapi denganvariabel
a
akan mendapatkan nilai kembali dariinitAll
fungsi yang dieksekusisumber
Saya terlambat 6 tahun tetapi saya merasa ini bisa dijelaskan jauh lebih sederhana daripada jawaban di atas.
Jadi di sini adalah TLDR ; atau pandangan mata burung saat memanggil fungsi menggunakan dan tidak menggunakan
()
'sMari kita ambil fungsi ini sebagai contoh:
jika Anda log "foo" - tanpa
()
Tidak menggunakan
()
sarana untuk mengambil fungsi itu sendiri . Anda akan melakukan ini jika ingin diteruskan sebagai callback.jika Anda memasukkan "foo ()" - dengan
()
Menggunakan
()
setelah suatu fungsi berarti menjalankan fungsi tersebut dan mengembalikan nilainya .sumber