8 回答

TA貢獻1799條經驗 獲得超9個贊
function func(){...}
這是函數聲明
,將在代碼執行前被(完整地)加載到作用域的最前端,因此在代碼編寫中可以(在同作用域或上層作用域中)后置,即題主所說的先調用再聲明。函數聲明/變量聲明都會被
hoisting
,其中函數聲明會被完整前置,而變量聲明僅前置聲明部分
而不前置賦值部分
。
代碼栗子:
(function(){
f1()
f2()
var f1 = function(){}
function f2(){}
})()
運行時:
(function(){
var f1,function f2(){} //hoisting,被隱式提升的聲明
f1() //ReferenceError: f1 is not defined
f2()
f1 = function(){}
})()
結論:
js目前就支持題主所說的先調用再聲明。


TA貢獻1846條經驗 獲得超7個贊
樓主是怎么得到這個結論的。
alert(a());
function a(){
return 1;
}//1
這樣的代碼是可以運行的。
alert(a());
var a=function(){
return 1;
}//error: unexpected indentifier
這樣的代碼才會報錯。
因為函數聲明會在js解析器解析時候率先解析,保證其他代碼執行之前,函數可用。而函數表達式必須要等到代碼解析器解析到他所在代碼行,才會被解釋執行。

TA貢獻1883條經驗 獲得超3個贊
樓主,你沒搞懂JS的函數聲明提升。
a();
function a(){};
這個是可以執行的,而像下面這樣是不行
a(); //a是undefined,a已是已經聲明了,因為var a,但是未賦值
var a = function(){};
添加回答
舉報