日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

function——函数声明头的提升和预解析

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的定義,就是undefinedundefined是無法執行的。

?


?

如有不當之處,敬請留言指正!

尊重原創,轉載請注明出處https://www.cnblogs.com/lshdashi/p/9441230.html


更多專業前端知識,請上 【猿2048】www.mk2048.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的function——函数声明头的提升和预解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。