Saya memanggil fungsi JavaScript saya. Mengapa saya terkadang mendapatkan error 'myFunction is not defined' padahal fungsi tersebut sudah didefinisikan?
Sebagai contoh. Saya kadang-kadang mendapatkan 'copyArray tidak didefinisikan' bahkan dalam contoh ini:
function copyArray( pa ) {
var la = [];
for (var i=0; i < pa.length; i++)
la.push( pa[i] );
return la;
}
Function.prototype.bind = function( po ) {
var __method = this;
var __args = [];
// Sometimes errors -- in practice I inline the function as a workaround.
__args = copyArray( arguments );
return function() {
/* bind logic omitted for brevity */
}
}
Seperti yang bisa Anda lihat, copyArray didefinisikan di sana, jadi ini tidak mungkin tentang urutan pemuatan file skrip.
Saya telah mendapatkan hal ini dalam situasi yang lebih sulit untuk diatasi, di mana fungsi pemanggilan terletak di file lain yang harus dimuat setelah fungsi yang dipanggil. Tetapi ini adalah kasus paling sederhana yang bisa saya sajikan, dan tampaknya menjadi masalah yang sama.
Hal ini tidak terjadi 100%, jadi saya menduga ada masalah yang berhubungan dengan load-timing. Tapi saya tidak tahu apa.
@Hojou: Itu adalah bagian dari masalah. Fungsi di mana saya sekarang mendapatkan kesalahan ini adalah addLoadEvent saya sendiri, yang pada dasarnya adalah versi standar dari fungsi perpustakaan umum.
@James: Saya mengerti itu, dan tidak ada kesalahan sintaksis dalam fungsi tersebut. Ketika itu terjadi, kesalahan sintaks juga dilaporkan. Dalam kasus ini, saya hanya mendapatkan 'not defined' error.
@David: Skrip dalam kasus ini berada di file eksternal yang direferensikan menggunakan metode normal <script src="file.js"></script> di bagian kepala halaman.
@Douglas: Ide yang menarik, tetapi jika demikian, bagaimana kita bisa memanggil fungsi yang ditentukan pengguna dengan percaya diri? Bagaimanapun, saya mencoba ini dan tidak berhasil.
@sk: Teknik ini telah diuji di seluruh browser dan pada dasarnya disalin dari pustaka Prototype.
Seharusnya hal ini tidak mungkin terjadi jika Anda hanya menyertakan skrip pada halaman.
Fungsi "copyArray" harus selalu tersedia ketika kode JavaScript mulai dijalankan, tidak peduli apakah itu dideklarasikan sebelum atau sesudahnya - kecuali jika Anda'memuat file JavaScript secara dinamis dengan pustaka ketergantungan. Ada berbagai macam masalah dengan pengaturan waktu jika itu yang terjadi.