Promosi pengisytiharan fungsi JavaScript, adakah badan fungsi akan dinaikkan pangkat bersama?
Jika bukan , terdapat contoh balas berikut:
console.log(demo.toString()); //‘function demo() {console.log('ok')}’
demo(); //‘ok’
function demo() {
console.log('ok')
}
Jika ialah , terdapat contoh balas berikut:
console.log(func) // undefined ,如果直接执行func()函数抛出TypeError异常
if(true){
function func() {
console.log('11');
};
}else{
function func() {
console.log('22');
};
}
func(); // 11
Contoh pertama menunjukkan bahawa badan fungsi juga dipromosikan jika anda mengikuti idea ini untuk memahami sekeping kod kedua, fungsi "menamakan semula" akan meliputi satu sama lain, dan yang kemudian akan meliputi yang sebelumnya, jadi, konsol. log(func) Rentetan 'function func() {console.log('22');};' akan menjadi output, tetapi ini sebenarnya tidak berlaku.
Timbul tiga persoalan:
Bagaimana anda memahami "promosi berubah-ubah, keutamaan fungsi"?
Adakah fungsi badan juga bertambah baik?
Bagaimana untuk mentafsir keputusan kod kedua?
Saya percaya anda akan memahami segala-galanya selepas membaca artikel yang saya tulis dan mempunyai pemahaman yang mendalam tentang konsep konteks pelaksanaan JavaScript, susunan fungsi dan promosi
jika mewakili pertimbangan bersyarat Kod tidak boleh dilaksanakan semasa penyusunan, tetapi hanya analisis sintaks dan leksikal akan disemak. Anda boleh cuba menukar penyemak imbas, atau dayakan mod ketat untuk ujian Perkara yang tidak dijangka mungkin berlaku~
1. Promosi pembolehubah, keutamaan fungsi, iaitu, var a = 1; dalam var a;
2. Juga dipertingkatkan. Ungkapan fungsi tidak akan, kerana ia adalah var fun = function(){}; Jenis ini hanya akan meningkatkan var fun;
3 Perenggan kedua sebenarnya boleh dijelaskan dengan cara berikut
Untuk pengenalan terperinci, lihat MDN http://kangax.github.io/nfe/#...
Dalam mod tidak ketat, sama ada pengisytiharan fungsi yang diletakkan di dalam pernyataan if akan dipromosikan bergantung pada pelaksanaan setiap kernel.
Kesimpulannya ialah fungsi akan ditambah baik, tetapi ia bergantung kepada pelaksanaan setiap teras apabila berada di dalam pernyataan if.
Mod ketat melarang pengisytiharan fungsi yang tidak berada pada tahap skrip atau fungsi
Anda boleh rujuk: /q/10...
Pengisytiharan fungsi dan pembolehubah akan dinaikkan pangkat. Kod pertama dipertingkatkan secara langsung. Fungsi yang anda takrifkan dalam kod kedua adalah dalam struktur pernyataan if Kedua-dua log dan jika harus dilaksanakan mengikut susunan dalam timbunan berjalan Jelas sekali, fungsi anda belum diisytiharkan sebelum pernyataan if dijalankan.
es6 mempunyai beberapa peraturan skop peringkat blok Jika anda menjalankannya dengan versi lama nod atau versi chrome yang lebih rendah, ia bersamaan dengan kod berikut
Walau bagaimanapun, versi nod dan krom yang lebih tinggi mengehadkan peningkatan pembolehubah sedemikian, yang membawa kepada situasi dalam kod anda! ~! ~.
Kerana JavaScript ialah skop peringkat fungsi (
function-level scope
)所以if中并没有独立维护一个
scope
Penjelasan Bahasa Inggeris:
javascript-variable-scope-and-hoisting-explained
Penjelasan bahasa Cina: Skop Javascript dan variable angkat
Lazimnya tidak disyorkan untuk menulis pengisytiharan fungsi dalam pernyataan bersyarat.
Ini sintaks tidak sah dalam ECMAScript dan enjin JavaScript akan cuba membetulkan ralat dan menukarnya kepada keadaan biasa dan munasabah. Walau bagaimanapun, kaedah pembetulan ini berbeza dalam pelayar yang berbeza. Adalah disyorkan untuk menggunakan ungkapan fungsi:
var func;
if(true){
}lain{
}
http://blog.csdn.net/qq673318...
Pautan ada penjelasan
————Porter