Apabila pengisytiharan fungsi javascript dipromosikan, adakah badan fungsi akan dinaikkan pangkat bersama-sama?
PHP中文网
PHP中文网 2017-05-19 10:43:15
0
10
703

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:

  1. Bagaimana anda memahami "promosi berubah-ubah, keutamaan fungsi"?

  2. Adakah fungsi badan juga bertambah baik?

  3. Bagaimana untuk mentafsir keputusan kod kedua?

PHP中文网
PHP中文网

认证0级讲师

membalas semua(10)
PHPzhong

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

var func;
console.log(func)
if(true){
    func=function func() {
        console.log('11');
    };
}else{
    func=function func() {
        console.log('22');
    };
}
func(); // 11

Peter_Zhu

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
.

function func() {
   console.log('22');
};

console.log(func);
if(true){
}else{
}

func(); // 22
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){

func=function {
    console.log('11');
};

}lain{

func=function {
    console.log('22');
};

}

phpcn_u1582

http://blog.csdn.net/qq673318...
Pautan ada penjelasan
————Porter

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan