javascript - Pengisytiharan fungsi dan pembolehubah yang diisytiharkan wujud pada masa yang sama, apakah peraturan untuk promosi?
高洛峰
高洛峰 2017-05-18 10:55:55
0
3
596

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!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(3)
仅有的幸福

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.

巴扎黑

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();
黄舟
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"
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan