javascript中,函數一定要這樣:
function a(){}a();
如果反了,就不行,比如:
a();function a(){};
但是在php裡就可以這樣:
a();function a(){}
同樣是指令碼語言,為什麼javascript不能在調用後申明?javascript後續版本中是否會實現這樣的功能?
回複內容:
javascript中,函數一定要這樣:
function a(){}a();
如果反了,就不行,比如:
a();function a(){};
但是在php裡就可以這樣:
a();function a(){}
同樣是指令碼語言,為什麼javascript不能在調用後申明?javascript後續版本中是否會實現這樣的功能?
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目前就支援題主所說的先調用再聲明。
http://jsfiddle.net/ZvLht/
目前ES5下是完全沒有問題的,不過似乎在ES6中這種情況會有所改變,印象中應該是在 http://es6.ruanyifeng.com/ 這裡看到過,不過不大記得在哪裡了,你可以翻翻看。
對於提升 hoisting 的理解,必須強烈推薦 @nightire 前輩的博文:
《理解 JavaScript(二)》
@nightire 前輩在博文中詳細講解和介紹了 Scoping & Hoisting,題主耐心讀完就基本清楚了。
順便提下我的一篇博文,也介紹了一點相關的內容,題主不妨也讀一下。:)
《細說 Javascript 函數篇(一) : 函式宣告和函數運算式》
你確定不可以?
test();function test() { console.log('test string');}
等你真正學會函數式編程,理解js裡面的閉包以後,你才會明白js的函數比php裡面的好用太多
這樣應該是統一規範語言,相容各種瀏覽器。
樓主是怎麼得到這個結論的。
alert(a());
function a(){
return 1;
}//1
這樣的代碼是可以啟動並執行。
alert(a());
var a=function(){
return 1;
}//error: unexpected indentifier
這樣的代碼才會報錯。
因為函式宣告會在js解析器解析時候率先解析,保證其他代碼執行之前,函數可用。而函數運算式必須要等到代碼解析器解析到他所在程式碼,才會被解釋執行。
樓主你確定實驗了你的代碼了麼
樓主問題本身就是錯誤的
樓主,你沒搞懂JS的函式宣告提升。
a();function a(){};
這個是可以執行的,而像下面這樣是不行
a(); //a是undefined,a已是已經聲明了,因為var a,但是未賦值var a = function(){};