javascript
了解javascript中函数执行顺序
我個人覺得一般人不會有這種寫法,但藝不壓身,呵呵。希望能幫到初學(xué)的朋友!大家一起進步!
首先列舉出8個例子,然后例子的解答會在文章末尾貼出!
測試代碼一:
// 兩次輸出的結(jié)果都是Fn2,而不是我們認為的第一次輸出Fn1,第二次輸出Fn2
測試代碼二:
<script type="text/javascript"> function myFn(){alert('Fn2'); }; myFn(); </script>
這次第一次輸出Fn1,第二次輸出Fn2.繼續(xù)測試,
測試代碼三:
這次輸出的結(jié)果是Fn1,Fn2.
測試代碼四:
輸出Fn1,Fn2.
測試代碼五:
輸出Fn1, Fn1
測試代碼六:
輸出結(jié)果是Fn2,Fn1,Fn1
測試代碼七:
輸出Fn1,而不是未定義的函數(shù)
測試代碼八:
則提示缺少對象,也就是函數(shù)沒定義。
測試代碼九:
則提示缺少對象,也就是函數(shù)沒定義。
注:這是我引用網(wǎng)絡(luò)上的部分文章內(nèi)容 我覺得挺好的,所以就在博客發(fā)出來,分享一下!
從上面的例子中,可以發(fā)現(xiàn)出一點,就是javascript好像也具有"預(yù)編譯"(這是我的叫法)的特點,有點類似于傳統(tǒng)編譯型c或c++等。但是在 javascript中,這種預(yù)編譯的特性并不是對所有的js代碼進行的。大家可以試下把myFn的函數(shù)定義分別放到不同的script代碼塊中進行調(diào)用 的時候,會提示對象為定義。所以我個人覺得,js中的這種“預(yù)編譯”特性值只是針對屬于同一個代碼塊(指的 是<script></script>)內(nèi)的代碼有效。
所以,在javascript的執(zhí)行過程中,js引擎掃描每一script塊的代碼,把里面的各種函數(shù)定義都抽出來進行“預(yù)編譯”,注意,這里說的是函數(shù)定義而不是函數(shù)賦值,或者說是定義式的函數(shù),如下的形式就是"定義式的函數(shù)":
function myFn(){
//Something Code
};
編譯完成后,就會根據(jù)script塊中的語句從上到下,從左到右進行執(zhí)行。然后咱們來分析一下各個測試的結(jié)果!
測試代碼一:
首 先js引擎掃描該script塊中的函數(shù)定義(注意這個時候還沒開始執(zhí)行代碼),發(fā)現(xiàn)有定義式函數(shù)function myFn(){}有兩處,由于名字是一樣的,編譯后就合成了一個myFn函數(shù),后面的定義覆蓋了前面的定義,所以在函數(shù)執(zhí)行之前就只有一個編譯的函數(shù) myFn,并且其定義是后面的那個,因此真正到執(zhí)行代碼的時候,也就是第一次調(diào)用myFn(),輸出的當然是Fn2,第二次執(zhí)行myFn同樣輸出Fn2.
測試代碼二:
由 于javascript的塊編譯特性,因此分成在不同的塊中的代碼是分開編譯的,所以第一個script塊編譯后的myFn函數(shù)并沒有被第二塊的myFn 覆蓋,因此第一個執(zhí)行myFn輸出的是Fn1,同樣第二塊輸出的是Fn2.需要重點指出的是var myFn = function(){};不是定義式函數(shù)聲明,而是賦值語句,把一個函數(shù)對象賦值給一個變量,賦值語句的執(zhí)行時機晚于編譯期,定義式函數(shù)是在執(zhí)行語句之 前就已經(jīng)完成了,而賦值語句要到執(zhí)行的時候才進行。所以結(jié)果就如同大家看到的一般!
根據(jù)這樣的分析,我想大家也應(yīng)該能夠看出后面例子的輸出結(jié)果了!
轉(zhuǎn)載于:https://www.cnblogs.com/yuyifeiyang/p/3540673.html
總結(jié)
以上是生活随笔為你收集整理的了解javascript中函数执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厉害了!北京人均5G基站数排全国第一 数
- 下一篇: 然爸读书笔记(2014-2)----影响