javascript的函數為什麼不能像php那樣先調用再申明?

來源:互聯網
上載者:User
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後續版本中是否會實現這樣的功能?

  1. function func(){...}這是函式宣告,將在代碼執行前被(完整地)載入到範圍的最前端,因此在代碼編寫中可以(在同範圍或上層範圍中)後置,即題主所說的先調用再聲明。
  2. 函式宣告/變數聲明都會被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(){};
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.