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.onloadkarena itu sedikit dibuat-buat untuk didemonstrasikan. Saya akan menggunakan fungsi perkalian sederhana untuk mendemonstrasikan:
function Multiply(operator, operand) {
return operator * operand;
}
Ini sama-sama bisa ditulis:
Multiply = function(operator, operand) {
return operator * operand;
}
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:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
Pada titik mendefinisikan variabel ret, Multiplydieksekusi dan nilai kembalian ditetapkan - retmenjadi sama dengan 12.
Mari kita coba lagi dengan cara yang berbeda:
var operator = 3;
var operand = 4;
var ret = Multiply;
Sekarang, pada titik pendefinisian ret, retmenjadi Multiplyfungsi Anda dan bukan hasil yang diperoleh dari Multiplyfungsi Anda . Panggilan ke ret()akan menyebabkan Multiplyfungsi Anda dijalankan, dan Anda dapat memanggilnya persis seperti jika Anda memanggil Multiply(operator, operand):
var out = ret(3, 4);
sama dengan
var out = Multiply(3, 4);
Anda telah secara efektif mengatakan bahwa Anda akan menggunakan retsebagai delegasi untuk Multiply(). Saat memanggil ret, kami benar-benar mengacu pada Multiplyfungsinya.
Kembali ke Anda window.onload. Pikirkan ini sebagai:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Jadi seperti yang Anda lihat, window.onloadadalah 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 istimewa window.onloaddari 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 yaitu if (window.onload) window.onload();].
Sekarang menyebut initAll()apa yang kami katakan adalah:
window.onload = initAll();
yang mungkin juga mengatakan:
window.onload = 12;
Tetapi ketika kami mengatakan initAlltanpa tanda kurung, yang sebenarnya kami katakan adalah: Saya ingin mengganti apa pun fungsi window.onload saya, dengan fungsi baru - yaitu saya ingin menggantinya dengan initAllfungsi saya , sehingga setiap panggilan untuk window.onloadmenjalankan initAllkode.
Begitu:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
diganti dengan:
window.onload = function() {
return 12;
}
Jadi setiap panggilan ke window.onloadakan menjalankan initAllfungsi Anda, bukan apa pun window.onloadyang semula. Anda telah mengganti fungsi asli dengan fungsi baru Anda.
Bahkan, Anda juga bisa menulis:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Contoh lain yang mungkin menunjukkan lebih baik adalah ini:
var d = new Date();
var currentTime = d.getTime();
Apapun waktu itu pada saat ditu ditentukan akhirnya ditetapkan ke currentTime. 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 yang currentTimedisebut?
var currentTime = function() {
var d = new Date();
return d.getTime();
}
var a = currentTime(); //The current time at the point a is defined...
var b = currentTime; //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined
Perhatikan bagaimana kita sebut b()di kami cdan dtugas persis seperti yang kita bisa menelepon currentTime()?