Dalam JavaScript, pengisytiharan fungsi mempunyai gelagat berbeza bergantung pada piawaian bahasa lazim dan persekitaran di mana ia dilaksanakan.
Dalam Mod Tegas (ES5)
Dalam mod ketat, diperkenalkan dalam ECMAScript 5 (ES5), pengisytiharan fungsi tidak dibenarkan dalam pernyataan bersyarat. Ini kerana pengisytiharan fungsi mencipta pembolehubah dinaikkan, yang diskop kepada keseluruhan fungsi atau skop global. Meletakkannya dalam pernyataan bersyarat akan memecahkan mekanisme angkat ini.
Mod Tidak Tegas (ES5)
Dalam mod tidak ketat, walau bagaimanapun, kelakuan pengisytiharan fungsi dalam pernyataan bersyarat tidak dapat diramalkan. Penyemak imbas dan enjin JavaScript yang berbeza melaksanakan peraturan mereka sendiri untuk mengendalikan situasi ini, yang membawa kepada hasil yang tidak konsisten.
Dalam JavaScript Moden (ES2015)
Sehingga 2018, kebanyakan penyemak imbas moden menyokong ECMAScript 2015 (ES2015), yang memperkenalkan tafsiran yang lebih ketat bagi pengisytiharan fungsi dalam blok. Dalam ES2015, pengisytiharan fungsi diskop kepada blok di mana ia diisytiharkan.
Contoh:
Pertimbangkan kod berikut:
<code class="javascript">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 mod ketat atau dalam ES2015, kod ini akan mengakibatkan ralat kerana fungsi a tidak ditakrifkan dalam skop global. Walau bagaimanapun, dalam mod tidak ketat, ia mungkin menghasilkan output yang berbeza bergantung pada pelaksanaan. Dalam contoh yang diberikan, Chrome mengeluarkan "foo" manakala Firefox mengeluarkan "19".
Cadangan:
Untuk mengelakkan tingkah laku yang tidak dijangka, adalah disyorkan untuk menggunakan ungkapan fungsi sebaliknya pengisytiharan fungsi apabila mentakrifkan fungsi secara bersyarat. Ungkapan fungsi mencipta fungsi berskop yang hanya boleh diakses dalam skop terdekatnya.
Atas ialah kandungan terperinci Bolehkah Anda Mengisytiharkan Fungsi Di Dalam Pernyataan Bersyarat dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!