Javascript-Funktionsdeklarationsf?rderung, wird der Funktionsk?rper gemeinsam gef?rdert?
Wenn nicht ist, gibt es das folgende Gegenbeispiel:
console.log(demo.toString()); //‘function demo() {console.log('ok')}’
demo(); //‘ok’
function demo() {
console.log('ok')
}
Wenn ist, gibt es das folgende Gegenbeispiel:
console.log(func) // undefined ,如果直接執(zhí)行func()函數(shù)拋出TypeError異常
if(true){
function func() {
console.log('11');
};
}else{
function func() {
console.log('22');
};
}
func(); // 11
Das erste Beispiel zeigt, dass auch der Funktionsk?rper hochgestuft wird. Wenn Sie den zweiten Teil des Codes gem?? dieser Idee verstehen, überdecken sich die ?Umbenennungs“-Funktionen gegenseitig und die sp?teren überdecken die vorherigen, also die Konsole. log(func) Die Zeichenfolge ?function func() {console.log('22');};“ wird ausgegeben, aber das ist eigentlich nicht der Fall.
Drei Fragen stellen sich:
Wie verstehen Sie ?variable F?rderung, Funktionspriorit?t“?
Ist auch die Funktion des K?rpers verbessert?
Wie sind die Ergebnisse des zweiten Codeteils zu interpretieren?
認(rèn)證0級(jí)講師
if代表著條件判斷,編譯的時(shí)候應(yīng)該是不會(huì)去執(zhí)行代碼,只會(huì)檢查語法詞法分析。你可以嘗試換瀏覽器,或者啟用嚴(yán)格模式做一下測試,有可能會(huì)有意想不到的事情發(fā)生哦~
1.變量提升,函數(shù)優(yōu)先,就是 var a = 1;function fun(){};中var a;和function fun(){}會(huì)提升上去,提升到作用域的頂層。
2.同樣提升了。函數(shù)表達(dá)式不會(huì),因?yàn)樗?var fun = function(){};這種,只會(huì)提升var fun;
3.第二段,其實(shí)可以用下面的方法解釋
var func;
console.log(func)
if(true){
func=function func() {
console.log('11');
};
}else{
func=function func() {
console.log('22');
};
}
func(); // 11
在非嚴(yán)格模式下,放在if語句內(nèi)部的函數(shù)聲明是否會(huì)提升在各個(gè)內(nèi)核的實(shí)現(xiàn)都不同。
結(jié)論是,函數(shù)會(huì)提升,但是在if語句內(nèi)部時(shí)要看各個(gè)內(nèi)核的實(shí)現(xiàn)。
嚴(yán)格模式禁止了不在腳本或者函數(shù)層面上的函數(shù)聲明
函數(shù)和變量聲明會(huì)被提升,函數(shù)提升優(yōu)先于變量提升,要直接運(yùn)行的代碼不能被提升吧。第一個(gè)代碼里直接都提升了。第二個(gè)代碼你定義的函數(shù)是在if 語句結(jié)構(gòu)里面,兩個(gè)log 和if 在運(yùn)行棧里面應(yīng)該是按順序執(zhí)行,顯然if 語句運(yùn)行之前你的func是還沒有聲明的 。
es6 有一些塊級(jí)作用域的規(guī)則,這個(gè)地方 如果你你用老版本的 node或者低版本的chrome 運(yùn)行
相當(dāng)于以下代碼
function func() {
console.log('22');
};
console.log(func);
if(true){
}else{
}
func(); // 22
可是 高版本的 node和chrome限制了 這樣的變量的提升,就出現(xiàn)了 你代碼的情況!~!~
因?yàn)镴avaScript是一種函數(shù)級(jí)作用域(function-level scope
)
所以if中并沒有獨(dú)立維護(hù)一個(gè)scope
英文解釋:
javascript-variable-scope-and-hoisting-explained
中文解釋:Javascript作用域和變量提升
一般不建議在條件判斷語句中書寫函數(shù)聲明。
這在ECMAScript中屬于無效語法,javascript引擎會(huì)嘗試修正錯(cuò)誤,將其轉(zhuǎn)換為正常合理的狀態(tài)。然后這種修正的做法在不同的瀏覽器是不一樣的。建議用函數(shù)表達(dá)式:
var func;
if(true){
func=function {
console.log('11');
};
}else{
func=function {
console.log('22');
};
}