![Why does `setTimeout` fail to execute with a function expression assigned to a variable before it's declared, but succeeds with function declarations?](https://img.php.cn/upload/article/000/000/000/172979256955204.jpg)
Perintah Pengisytiharan dan Penilaian Fungsi JavaScript
Masalah:
Mengapa contoh JavaScript berikut gagal dilaksanakan?
<code class="javascript">(function() {
setTimeout(someFunction1, 10);
var someFunction1 = function() { alert('here1'); };
})();</code>
Salin selepas log masuk
Sementara contoh lain yang serupa berfungsi seperti yang dimaksudkan:
<code class="javascript">(function() {
setTimeout(someFunction2, 10);
function someFunction2() { alert('here2'); }
})();
(function() {
setTimeout(function() { someFunction3(); }, 10);
var someFunction3 = function() { alert('here3'); };
})();
(function() {
setTimeout(function() { someFunction4(); }, 10);
function someFunction4() { alert('here4'); }
})();</code>
Salin selepas log masuk
Penyelesaian:
Isunya terletak pada susunan penilaian antara pengisytiharan fungsi dan ungkapan fungsi.
Pengisytiharan Fungsi lwn. Ungkapan
-
Pengisytiharan: Mengisytiharkan fungsi menggunakan kata kunci fungsi (cth., function someFunction( ) {}). Pengisytiharan fungsi diproses semasa fasa kompilasi.
-
Ungkapan: Mencipta fungsi menggunakan ungkapan yang menilai fungsi (cth., () => {} ). Ungkapan fungsi diproses semasa fasa pelaksanaan.
Perintah Penilaian
Kod JavaScript menjalani dua fasa pemprosesan:
-
Kompilasi: Pembolehubah dicipta dan pengisytiharan fungsi diproses.
-
Pelaksanaan: Ungkapan fungsi dan kod lain dilaksanakan.
Analisis Contoh
-
Contoh 1:
- Fungsi someFunction1 dicipta sebagai ungkapan fungsi semasa fasa pelaksanaan.
- Fungsi setTimeout dipanggil sebelum someFunction1 dinilai sepenuhnya dan diberikan kepada pembolehubah someFunction1.
- Fungsi setTimeout menerima nilai yang tidak ditentukan untuk someFunction1 dan gagal dilaksanakan.
-
Contoh 2, 3 dan 4:
- Dalam setiap contoh ini, fungsi diisytiharkan menggunakan kata kunci fungsi, menjadikannya pengisytiharan fungsi.
- Pengisytiharan fungsi diproses semasa fasa penyusunan, jadi ia wujud sebelum fungsi setTimeout dipanggil.
- Fungsi setTimeout menerima rujukan fungsi yang sah dan dilaksanakan dengan jayanya.
Penjelasan Tambahan
- Argumen fungsi dalam JavaScript sentiasa diluluskan oleh nilai, bermakna fungsi setTimeout tidak merujuk terus pembolehubah someFunction1 tetapi sebaliknya salinan fungsi yang dirujuknya.
Atas ialah kandungan terperinci Mengapakah `setTimeout` gagal dilaksanakan dengan ungkapan fungsi yang diberikan kepada pembolehubah sebelum ia diisytiharkan, tetapi berjaya dengan pengisytiharan fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!