JS聲明式函數(shù)與賦值式函數(shù)實(shí)例分析
本文實(shí)例講述了JS聲明式函數(shù)與賦值式函數(shù)。分享給大家供大家參考,具體如下:
引言
“程序是不會(huì)騙人的”我們項(xiàng)目中的一個(gè)哥們經(jīng)常這樣說(shuō),為什么他會(huì)有這樣的感嘆呢?就是有時(shí)候我么程序員會(huì)出現(xiàn)的這樣的問(wèn)題,當(dāng)我們讓別人來(lái)調(diào)試錯(cuò)誤的時(shí)候,別人什么都沒(méi)有說(shuō),在我們給人家復(fù)現(xiàn)錯(cuò)誤的時(shí)候發(fā)現(xiàn),錯(cuò)誤竟然沒(méi)有了,留下自己在風(fēng)中凌亂。此處中槍的童鞋們請(qǐng)頂起來(lái)。。。。。。下面說(shuō)說(shuō)小編給別人調(diào)BUG時(shí)候遇到的問(wèn)題如下:
請(qǐng)聽(tīng)題:說(shuō)出下面幾段js腳本的結(jié)果是什么?
<script type="text/javascript"> Fn(); //執(zhí)行結(jié)果:????? function Fn(){ alert("執(zhí)行了定義式函數(shù)"); } </script> <script type="text/javascript"> Fn(); //執(zhí)行結(jié)果:????? var Fun= function(){ alert("執(zhí)行了賦值式函數(shù)"); } </script> <script type="text/javascript"> Fn(); //執(zhí)行結(jié)果:????? function Fn(){ alert("執(zhí)行了函數(shù)1"); } function Fn(){ alert("執(zhí)行了函數(shù)2"); } </script>
如果你能很好的得出答案的話,說(shuō)明你對(duì)JS的這兩種函數(shù)以及他們?cè)趫?zhí)行順序方面是比較清楚的,所以下面的講解你就可帶著審判的眼光來(lái)閱讀了,否則的話你就不得不好好看看下面的講解了,也許下面的講解會(huì)給你一些額外的驚喜。
通過(guò)上面的代碼中alet中的內(nèi)容我們就可以分辨出這兩種函數(shù),這兩種函數(shù)在js執(zhí)行的時(shí)候會(huì)出現(xiàn)一些區(qū)別,在JS的預(yù)編譯期,聲明式函數(shù)將會(huì)先被提取出來(lái),然后才按順序執(zhí)行js代碼。
事實(shí)上,JS的解析過(guò)程分為兩個(gè)階段:預(yù)編譯期(預(yù)處理)與執(zhí)行期。
預(yù)編譯期JS會(huì)對(duì)本代碼塊中的所有聲明的變量和函數(shù)進(jìn)行處理(類(lèi)似與C語(yǔ)言的編譯),但需要注意的是此時(shí)處理函數(shù)的只是聲明式函數(shù),而且變量也只是進(jìn)行了聲明但未進(jìn)行初始化以及賦值。知道了這個(gè)原理以后我們就可以很好的分析上面的第一段js代碼了,第一個(gè)js代碼塊得出的結(jié)果是:執(zhí)行了alert函數(shù);而第二個(gè)js代碼塊得出的結(jié)果是:瀏覽器保存,提示函數(shù)未定義!這就是這兩種函數(shù)的不同。
第二段js代碼就是買(mǎi)一贈(zèng)一優(yōu)惠政策,給讀者贈(zèng)送的一些東西了,它執(zhí)行的結(jié)果是:彈出"執(zhí)行了函數(shù)2",這是因?yàn)樵趈s中重名的函數(shù),后定義的會(huì)覆蓋前面定義的函數(shù),這種策略和js的順序執(zhí)行也是有關(guān)系的。小編在最近就是因?yàn)橛龅搅诉@種函數(shù)給我代碼的麻煩所以才查了一些資料來(lái)整理了這篇博客。
小結(jié)
在開(kāi)始的時(shí)候代碼中寫(xiě)是賦值式函數(shù),但是調(diào)用的代碼寫(xiě)在了函數(shù)的前面從而導(dǎo)致程序出錯(cuò),因?yàn)橹皩?duì)于賦值式函數(shù)見(jiàn)到的并不多,這不知道這兩種函數(shù)的區(qū)別,所以相當(dāng)熱的認(rèn)為將調(diào)用函數(shù)的代碼寫(xiě)在函數(shù)定義之前和之后是沒(méi)有影響的,所以給小編帶來(lái)很大的困惑。當(dāng)然也是我們思想上的相當(dāng)然帶來(lái)的后果,一些東西我們并沒(méi)有去驗(yàn)證就認(rèn)為應(yīng)該是這樣的,從而給我們帶來(lái)阻礙,在此也給廣大程序猿們警告哦。。。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript遍歷算法與技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- 深入探討javascript函數(shù)式編程
- JavaScript與函數(shù)式編程解釋
- JavaScript 函數(shù)式編程實(shí)踐(來(lái)自IBM)
- JavaScript 函數(shù)式編程的原理
- 用函數(shù)式編程技術(shù)編寫(xiě)優(yōu)美的 JavaScript
- JavaScript的函數(shù)式編程基礎(chǔ)指南
- js 函數(shù)式編程學(xué)習(xí)筆記
- 探究JavaScript函數(shù)式編程的樂(lè)趣
- 《JavaScript函數(shù)式編程》讀后感
- JavaScript函數(shù)式編程(Functional Programming)聲明式與命令式實(shí)例分析
相關(guān)文章
JavaScript?error瀏覽器端錯(cuò)誤捕獲處理方法筆記解決示例
這篇文章主要為大家介紹了JavaScript?error瀏覽器端錯(cuò)誤捕獲處理方法筆記解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06js驗(yàn)證電話號(hào)碼與手機(jī)支持+86的正則表達(dá)式
本篇文章主要介紹了js驗(yàn)證電話號(hào)碼與手機(jī)支持+86的正則表達(dá)式。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01BootStrap Validator對(duì)于隱藏域驗(yàn)證和程序賦值即時(shí)驗(yàn)證的問(wèn)題淺析
這篇文章主要介紹了BootStrap Validator對(duì)于隱藏域驗(yàn)證和程序賦值即時(shí)驗(yàn)證的問(wèn)題的解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)鏈接的幾種方式匯總
這篇文章主要介紹了JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)鏈接的幾種方式,簡(jiǎn)單總結(jié)了幾種頁(yè)面跳轉(zhuǎn)功能的實(shí)現(xiàn),有使用js跳轉(zhuǎn)頁(yè)面,返回上一次預(yù)覽界面及button按鈕添加事件跳轉(zhuǎn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-01-01es6中class類(lèi)靜態(tài)方法,靜態(tài)屬性,實(shí)例屬性,實(shí)例方法的理解與應(yīng)用分析
這篇文章主要介紹了es6中class類(lèi)靜態(tài)方法,靜態(tài)屬性,實(shí)例屬性,實(shí)例方法的理解與應(yīng)用,結(jié)合實(shí)例形式分析了es6 class類(lèi)靜態(tài)方法,靜態(tài)屬性,實(shí)例屬性,實(shí)例方法相關(guān)概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02js點(diǎn)擊按鈕實(shí)現(xiàn)多張圖片循環(huán)切換
這篇文章主要為大家詳細(xì)介紹了js點(diǎn)擊按鈕實(shí)現(xiàn)多張圖片循環(huán)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01