Rumah >hujung hadapan web >tutorial js >Mengapa Kod JavaScript Ini Gagal, Walaupun Contoh Serupa Berfungsi?

Mengapa Kod JavaScript Ini Gagal, Walaupun Contoh Serupa Berfungsi?

Linda Hamilton
Linda Hamiltonasal
2024-10-25 07:59:29534semak imbas

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

Perintah Pengisytiharan dan Penilaian Fungsi JavaScript

Latar Belakang:

Dalam JavaScript, fungsi boleh diisytiharkan atau dicipta menggunakan ungkapan. Pengisytiharan fungsi berlaku semasa fasa penyusunan, manakala ungkapan fungsi dinilai semasa fasa pelaksanaan. Memahami perbezaan ini adalah penting untuk memahami kelakuan kod JavaScript.

Soalannya:

Mengapakah contoh pertama dalam blok kod berikut gagal, manakala contoh yang selebihnya laksanakan dengan jayanya?

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>

Jawapannya:

Kegagalan contoh pertama bukan disebabkan isu skop atau penutupan sebaliknya salah faham antara pengisytiharan dan ungkapan .

Pengisytiharan Fungsi lwn. Ungkapan:

  • Fungsi pengisytiharan ikut sintaks: nama fungsi (argumen) {code}
  • Fungsi ungkapan ditulis sebagai ungkapan, serupa dengan pengisytiharan fungsi, tetapi dinilai pada masa jalan.

Fasa 1: Penyusunan

Semasa penyusunan, pengkompil memproses pengisytiharan fungsi, mencipta pembolehubah untuk fungsi. Dalam contoh pertama, pembolehubah someFunction1 dicipta tetapi kekal tidak ditentukan kerana nilainya (badan fungsi) dinilai kemudian.

Fasa 2: Pelaksanaan

Contoh 1:

Pada masa jalanan, jurubahasa menemui setTimeout(someFunction1, 10) dan cuba menghantar someFunction1 yang tidak ditentukan kepada setTimeout.

Contoh 2:

Sebaliknya, function someFunction2() ialah pengisytiharan, mencipta fungsi semasa penyusunan. Apabila setTimeout dipanggil, ia menerima rujukan fungsi yang disusun.

Contoh 3:

Di sini, fungsi tanpa nama dihantar ke setTimeout, yang mewujudkan penutupan kepada pembolehubah beberapaFungsi3. Apabila setTimeout dicetuskan, someFunction3 telah diberikan nilai dan fungsi tersebut berjaya dilaksanakan.

Contoh 4:

Serupa dengan Contoh 2, fungsi someFunction4 diisytiharkan, menjadikan rujukannya tersedia untuk setTimeout.

Penjelasan Tambahan:

  • Argumen fungsi dalam JavaScript diluluskan mengikut nilai untuk jenis primitif dan dengan rujukan untuk objek. Ini bermakna setTimeout tidak menerima penutupan kepada someFunction.
  • Memahami perbezaan antara pengisytiharan dan ungkapan adalah penting untuk meramalkan kelakuan kod JavaScript.

Atas ialah kandungan terperinci Mengapa Kod JavaScript Ini Gagal, Walaupun Contoh Serupa Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn