亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

DIEA 2019-03-21 19:11:43
javascript中,函數一定要這樣:function a(){}a();如果反了,就不行,比如:a();function a(){};但是在php里就可以這樣:a();function a(){}同樣是腳本語言,為什么javascript不能在調用后申明?javascript后續版本中是否會實現這樣的功能?
查看完整描述

8 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

  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目前就支持題主所說的先調用再聲明。


查看完整回答
反對 回復 2019-04-12
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

對于提升 hoisting 的理解,必須強烈推薦 @nightire 前輩的博文:

《理解 JavaScript(二)》

@nightire 前輩在博文中詳細講解和介紹了 Scoping & Hoisting,題主耐心讀完就基本清楚了。

順便提下我的一篇博文,也介紹了一點相關的內容,題主不妨也讀一下。:)

《細說 Javascript 函數篇(一) : 函數聲明和函數表達式》


查看完整回答
反對 回復 2019-04-12
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

你確定不可以?


test();

function test() {

    console.log('test string');

}


查看完整回答
反對 回復 2019-04-12
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

等你真正學會函數式編程,理解js里面的閉包以后,你才會明白js的函數比php里面的好用太多


查看完整回答
反對 回復 2019-04-12
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

這樣應該是統一規范語言,兼容各種瀏覽器。


查看完整回答
反對 回復 2019-04-12
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

樓主是怎么得到這個結論的。
alert(a());
function a(){
return 1;
}//1
這樣的代碼是可以運行的。

alert(a());
var a=function(){
return 1;
}//error: unexpected indentifier
這樣的代碼才會報錯。

因為函數聲明會在js解析器解析時候率先解析,保證其他代碼執行之前,函數可用。而函數表達式必須要等到代碼解析器解析到他所在代碼行,才會被解釋執行。


查看完整回答
反對 回復 2019-04-12
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

樓主,你沒搞懂JS的函數聲明提升。


a();

function a(){};

這個是可以執行的,而像下面這樣是不行


a();   //a是undefined,a已是已經聲明了,因為var a,但是未賦值

var a = function(){};


查看完整回答
反對 回復 2019-04-12
  • 8 回答
  • 0 關注
  • 546 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號