本文實例講述了JS聲明式函數與賦值式函數。分享給大家供大家參考,具體如下:
引言
“程序是不會騙人的”我們項目中的一個哥們經常這樣說,為什麼他會有這樣的感歎呢?就是有時候我麼程序員會出現的這樣的問題,當我們讓別人來調試錯誤的時候,別人什麼都沒有說,在我們給人家復現錯誤的時候發現,錯誤竟然沒有了,留下自己在風中凌亂。此處中槍的童鞋們請頂起來。。。。。。下面說說小編給別人調BUG時候遇到的問題如下:
請聽題:說出下面幾段js腳本的結果是什麼?
<script type="text/javascript"> Fn(); //執行結果:????? function Fn(){ alert("執行了定義式函數"); } </script> <script type="text/javascript"> Fn(); //執行結果:????? var Fun= function(){ alert("執行了賦值式函數"); } </script> <script type="text/javascript"> Fn(); //執行結果:????? function Fn(){ alert("執行了函數1"); } function Fn(){ alert("執行了函數2"); } </script>
如果你能很好的得出答案的話,說明你對JS的這兩種函數以及他們在執行順序方面是比較清楚的,所以下面的講解你就可帶著審判的眼光來閱讀了,否則的話你就不得不好好看看下面的講解了,也許下面的講解會給你一些額外的驚喜。
通過上面的代碼中alet中的內容我們就可以分辨出這兩種函數,這兩種函數在js執行的時候會出現一些區別,在JS的預編譯期,聲明式函數將會先被提取出來,然後才按順序執行js代碼。
事實上,JS的解析過程分為兩個階段:預編譯期(預處理)與執行期。
預編譯期JS會對本代碼塊中的所有聲明的變量和函數進行處理(類似與C語言的編譯),但需要注意的是此時處理函數的只是聲明式函數,而且變量也只是進行了聲明但未進行初始化以及賦值。知道了這個原理以後我們就可以很好的分析上面的第一段js代碼了,第一個js代碼塊得出的結果是:執行了alert函數;而第二個js代碼塊得出的結果是:浏覽器保存,提示函數未定義!這就是這兩種函數的不同。
第二段js代碼就是買一贈一優惠政策,給讀者贈送的一些東西了,它執行的結果是:彈出"執行了函數2",這是因為在js中重名的函數,後定義的會覆蓋前面定義的函數,這種策略和js的順序執行也是有關系的。小編在最近就是因為遇到了這種函數給我代碼的麻煩所以才查了一些資料來整理了這篇博客。
小結
在開始的時候代碼中寫是賦值式函數,但是調用的代碼寫在了函數的前面從而導致程序出錯,因為之前對於賦值式函數見到的並不多,這不知道這兩種函數的區別,所以相當熱的認為將調用函數的代碼寫在函數定義之前和之後是沒有影響的,所以給小編帶來很大的困惑。當然也是我們思想上的相當然帶來的後果,一些東西我們並沒有去驗證就認為應該是這樣的,從而給我們帶來阻礙,在此也給廣大程序猿們警告哦。。。
更多關於JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數據結構與算法技巧總結》、《JavaScript數學運算用法總結》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript錯誤與調試技巧總結》及《JavaScript遍歷算法與技巧總結》
希望本文所述對大家JavaScript程序設計有所幫助。