Rumah  >  Artikel  >  hujung hadapan web  >  Bolehkah Pengisytiharan Fungsi Dalam Pernyataan Bersyarat Membawa kepada Gelagat Tidak Dijangka dalam JavaScript?

Bolehkah Pengisytiharan Fungsi Dalam Pernyataan Bersyarat Membawa kepada Gelagat Tidak Dijangka dalam JavaScript?

Barbara Streisand
Barbara Streisandasal
2024-11-02 21:26:30458semak imbas

Can Function Declarations Within Conditional Statements Lead to Unexpected Behavior in JavaScript?

Pengisytiharan Fungsi Dalam Pernyataan Bersyarat: Kajian Kes

Soalan ini berkisar tentang kelakuan pengisytiharan fungsi apabila bersarang dalam pernyataan if/else. Secara tradisinya dalam JavaScript, pengisytiharan fungsi dinaikkan dan mempunyai skop global, tanpa mengira kedudukan fizikalnya dalam kod. Dalam mod ketat ES5, pengisytiharan fungsi dihadkan kepada skop peringkat atas atau dalam fungsi. Mod tidak ketat mempunyai tingkah laku yang tidak dapat diramalkan, mengakibatkan ketidakkonsistenan antara penyemak imbas.

Dalam contoh yang diberikan:

<code class="js">var abc = '';
if (1 === 0) {
  function a() {
    abc = 7;
  }
} else if ('a' === 'a') {
  function a() {
    abc = 19;
  }
} else if ('foo' === 'bar') {
  function a() {
    abc = 'foo';
  }
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'</code>

Dalam JavaScript moden (ES2015 dan lebih baharu), pengisytiharan fungsi dalam blok kini dibenarkan . Walau bagaimanapun, ia adalah skop kepada blok di mana ia diisytiharkan. Ini bermakna dalam contoh di atas:

  • Jika ia berjalan dalam persekitaran ES5 yang ketat, kod tersebut akan menghasilkan ralat kerana fungsi tidak boleh diisytiharkan di dalam blok.
  • Jika ia berjalan dalam persekitaran ES5 yang tidak ketat, pelayar yang berbeza mungkin mempunyai gelagat yang berbeza.
  • Dalam persekitaran ES2015, fungsi a akan diisytiharkan dalam skop setiap pernyataan if. Oleh itu, apabila a() dipanggil, ia akan mengakses pembolehubah abc yang diisytiharkan dalam skop global dan memberikannya nilai 'foo' (nilai yang diberikan dalam pernyataan else if akhir).

Kepada mentakrifkan fungsi secara bersyarat, adalah disyorkan untuk menggunakan ungkapan fungsi dan bukannya pengisytiharan fungsi. Ini memastikan bahawa skop fungsi ditakrifkan dengan jelas dan boleh diramal.

Atas ialah kandungan terperinci Bolehkah Pengisytiharan Fungsi Dalam Pernyataan Bersyarat Membawa kepada Gelagat Tidak Dijangka dalam JavaScript?. 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