cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Pengisytiharan fungsi dan pembolehubah yang diisytiharkan wujud pada masa yang sama, apakah peraturan untuk promosi?

Kami tahu bahawa pengisytiharan pembolehubah akan dinaikkan pangkat:

var a = 1;
//上面一行相当于下面这样:
var a;
a = 1;

Pada masa yang sama, pengisytiharan fungsi juga akan dipromosikan:

foo();
function foo(){};
//上面两行相当于下面这样:
var foo;
foo = function (){};
foo()

Jadi, apabila terdapat pengisytiharan pembolehubah dan fungsi, siapa yang akan naik ke atas? Bagaimana untuk menyusun? Contohnya:

var a = 1;
foo();
function foo(){};

Begitukah?

var a;
var foo;
a = 1;
foo = function(){};
foo();

Kerana saya melihat ayat ini dalam "JAVASCRIPT You Don't Know" dan saya agak keliru:

Pengisytiharan fungsi dan pengisytiharan berubah-ubah akan dinaikkan pangkat. Tetapi perincian yang perlu diberi perhatian ialah fungsi dipromosikan terlebih dahulu, kemudian pembolehubah. Pengisytiharan fungsi dinaikkan sebelum pembolehubah biasa.

Jadi ia akan disusun seperti ini:

var foo;
foo = function(){};
var a;
a = 1;
foo();

Cari peraturan pengisihan, terima kasih!

高洛峰高洛峰2808 hari yang lalu617

membalas semua(3)saya akan balas

  • 仅有的幸福

    仅有的幸福2017-05-18 10:57:55

    Pernyataan "naik pangkat dulu" ini sebenarnya disalah ertikan. Spesifikasi tidak dalam susunan tertentu (jika anda berminat dengan pelaksanaan V8, anda boleh membaca di sini).

    var 的提升是声明跟赋值分开,function Penambahbaikan ialah keseluruhan penambahbaikan, jadi

    var a = 1;
    a();
    function a(){};

    akan menjadi seperti ini

    var a;
    function a(){};
    a = 1;
    a();

    Jadi ada kesan fungsi yang dipromosikan dahulu.

    balas
    0
  • 巴扎黑

    巴扎黑2017-05-18 10:57:55

    Pertama sekali, kita boleh bahagikan kepada 4 isi kandungan

    var a ;
    a =1;
    foo();
    function foo();
    

    Kami ingin tahu bagaimana rupa format pengisihan selepas promosi?
    Syarat semasa yang diketahui ialah pengisytiharan pembolehubah akan dinaikkan pangkat kepada sebelum penugasan pembolehubah, jadi kita boleh meletakkan perisytiharan pembolehubah dalam dua digit pertama dahulu, tanpa mengira susunan dalamannya buat masa ini:

    var a ;
    function foo(){};
    a=1;
    foo();
    

    Seterusnya, mari tentukan susunan dalaman modul pengisytiharan dan tugasan masing-masing.
    Untuk menjalankan eksperimen, kami mengembangkan fungsi foo, jadi susunan semasa ialah:

    var a;
    function foo(){console.log(a+1)};
    a=1;
    foo();
    

    Jangan risau mengapa kami mengubahnya seperti ini. Kami akan memahaminya semasa percubaan.
    Untuk memudahkan pemahaman, eksperimen dijalankan dalam dua kali.
    Pertama: kami bereksperimen dengan modul pengisytiharan berubah-ubah.

    var a=1;
    console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。
    foo();
    function foo(){console.log(a+1)};
    

    Kemudian: kami bereksperimen dengan modul tugasan boleh ubah.

    var a=1;
    foo();//若输出为undefined1,则证明foo()在a=1之前;若输出为2,则说明a=1在foo()之前。
    function foo(){console.log(a+1)};
    

    Jom buat eksperimen:

    var a=1;
    console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。
    foo();
    function foo(){console.log(a+1)};
    
    VM1099:2 function foo(){console.log(a+1)}
    VM1099:4 2
    

    Berdasarkan keputusan percubaan, keputusan ranking terakhir kami ialah:

    function foo(){};
    var a;
    a=1;
    foo();
    

    balas
    0
  • 黄舟

    黄舟2017-05-18 10:57:55

    var a = 1;
    foo();
    function foo(){};
    提升之后
    function foo(){};
    var a;
    a = 1;
    foo();
    
    给你举个更明显的例子
    console.log(1, foo, typeof foo);
    var foo = "变量";
    console.log(2, foo, typeof foo);
    function foo(){
        console.log("函数声明");
    }
    console.log(3, foo, typeof foo);
    =》
    function foo(){
        console.log("函数声明");
    }
    var foo;
    console.log(1, foo, typeof foo);
    foo = "变量";
    console.log(2, foo, typeof foo);
    console.log(3, foo, typeof foo);
    输出为:
    1 function foo(){
        console.log("函数声明");
    } "function"
    2 "变量" "string"
    3 "变量" "string"

    balas
    0
  • Batalbalas