cari

Rumah  >  Soal Jawab  >  teks badan

Apabila pengisytiharan fungsi javascript dipromosikan, adakah badan fungsi akan dinaikkan pangkat bersama-sama?

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中文网2835 hari yang lalu761

membalas semua(10)saya akan balas

  • PHPz

    PHPz2017-05-19 10:45:15

    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

    balas
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:45:15

    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
    
    

    balas
    0
  • 天蓬老师

    天蓬老师2017-05-19 10:45:15

    Untuk pengenalan terperinci, lihat MDN http://kangax.github.io/nfe/#...

    balas
    0
  • 某草草

    某草草2017-05-19 10:45:15

    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

    balas
    0
  • ringa_lee

    ringa_lee2017-05-19 10:45:15

    Anda boleh rujuk: /q/10...

    balas
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    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.

    balas
    0
  • 怪我咯

    怪我咯2017-05-19 10:45:15

    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! ~! ~

    balas
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:45:15

    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

    balas
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    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');
    };

    }

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:15

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

    balas
    0
  • Batalbalas