function——函数声明头的提升和预解析
函數:
即function語句的集合,就是將多個語句封裝到一起;
函數的執行要會自己遍歷,遇見函數 a();執行語句,就要移交控制權,函數執行完畢之后,控制權又移交回來了!
函數的參數要羅列在function定義的圓括號內sum(a,b),用逗號隔開,叫做形式參數,調用的時候,圓括號里面是實際參數sum(1,2),參數在JS中不用指定類型,調用的時候參數個數也可以和定義的時候不一樣。
1 //函數的參數和返回值 2 function sum(a,b){ 3 return a b; 4 alert("我不會執行,因為我在return后面"); 5 } 6 7 //矮化為表達式了console.log(sum(1,2));?
?
函數聲明頭的提升
函數聲明頭的提升,程序一開始就會有一個預解析的過程,程序會通看全部代碼,把所有的函數名字都放到開頭預習一下,程序自己知道了,頁面上有這個函數定義。但是,函數表達式是不能預解析的。
敲黑板!!!
函數表達式:如var a = function(); 。
function沒有名字,只是個匿名函數,a不是函數的名字,變量a是匿名函數的一個引用而已!!!
//函數聲明頭的提升 a1(); a2();function a1(){alert("11111111");}//函數表達式是不能預解析的var a2 = function(){alert("22222222");}a1()會正常彈窗!
a2()會報錯;函數表達式是不能被預解析的(劃重點要考)
?
?
函數優先
如果同一個標識符,在程序中又是變量的名字,又是函數的名字,解析器會把標識符給函數。
a();var a=1;function a(){alert("我優先");}?
在a();之前函數已經把function a();預解析了。a就是函數了,雖然變量a也有一個變量聲明頭的提升,但是干不過函數聲明頭的提升,所以a()就會執行函數;
?
?
var a=1;function a(){alert("我能被執行了嗎?");}a();1.在執行var a = 1之前,函數已經把function a()預解析了,程序就已經知道頁面上有一個函數叫做a。
2.但是開始執行程序之后,定義了一個變量a,所以標識符a,就又變成變量了。
3.遇見function定義,程序會無視,因為已經預解析了。直到a()運行的時候,a就是變量,無法運行,報錯。
?上面三點可能有點繞,需要慢慢理解,仔細琢磨!
var a=1;var a= function(){alert("你猜我能被執行了嗎?");}a();有沒有想過,這種寫法竟然可以被執行,?????
因為上文提到函數表達式 var a= function()? 是不會被預解析的,程序剛運行時a是一個變量,后來又遇見一個函數的引用a;所以最后這個標識符a就是函數;
?
?
a();var a=1;var a= function(){alert("如果這樣寫呢?");}?
console.log(a);var a=1;var a= function(){alert("如果這樣寫呢?");}?
?
函數表達式是不會預解析的,所以預解析的就是變量a的定義,就是undefined,undefined是無法執行的。
?
?
如有不當之處,敬請留言指正!
尊重原創,轉載請注明出處https://www.cnblogs.com/lshdashi/p/9441230.html
更多專業前端知識,請上 【猿2048】www.mk2048.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的function——函数声明头的提升和预解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 数据类型判断
- 下一篇: 【HBuilder】手机App推送至Ap