javascript
javascript耐人寻味
在思考javascript解釋過(guò)程的時(shí)候,看過(guò)別人幾篇文章,自己做了幾個(gè)測(cè)試
? ?
容易理解,在javascript,形如這樣的代碼可以正常執(zhí)行:
?
alert(hello()); function hello(){alert('hello'); }?
可以得到“hello”字符串。
形如這樣的代碼,有問(wèn)題。
alert(hello());var hello = function(){alert('hello');}?
結(jié)果為undefined。兩種代碼執(zhí)行結(jié)果不同的原因是,在javascript執(zhí)行之前有個(gè)預(yù)解釋階段,形如function name()方式定義的函數(shù)會(huì)優(yōu)先賦值,就是說(shuō)第一遍name變量就已經(jīng)指向相應(yīng)函數(shù)了,所以第一段代碼在解釋階段可以訪問(wèn)到后面的hello函數(shù),第二段代碼中,則還要講到,預(yù)解釋階段創(chuàng)建一個(gè)活動(dòng)對(duì)象,然后在這個(gè)對(duì)象里把變量丟進(jìn)
去,而這種定義函數(shù)的方式會(huì)然解釋器認(rèn)為hello是一個(gè)變量,所以,給他們賦值為undefined,第二段代碼實(shí)際是以變量的形式保存了hello的值為undefined,故執(zhí)行階段時(shí)它還是允許了undefined,它在后面才得到函數(shù)定義。 當(dāng)然,html的執(zhí)行順序是從上到下執(zhí)行,那么嵌套在,<script></script>也應(yīng)該是從上到下一塊一塊執(zhí)行,即使是外鏈接的javascript代
碼也不例外。 接下來(lái)是這一段代碼 function hello(){alert('hello');}hello();var hello = function () {alert('hello2')}hello();
你可以想象上面的解釋,然后想象結(jié)果。
結(jié)果和預(yù)想的一樣,“hello”,“hello2”。怎么樣,是不是有點(diǎn)糊涂了,之前我們把hello放前面,所以執(zhí)行到前面的hello時(shí)是undefined,首先,看上面代碼,預(yù)解釋階段,本應(yīng)該報(bào)錯(cuò)的第一個(gè)hello正常執(zhí)行,說(shuō)明了給hello定義undefined在預(yù)解釋階段應(yīng)該是在函數(shù)定義之前 然后是這一段,結(jié)果是什么呢,需要思考下了 function hello(){alert('hello');}hello();function hello() {alert('hello2')}hello();
?
兩次都是hello2而不是hello和hello2,結(jié)合前面的,可以理解,在預(yù)編譯階段已經(jīng)把hello重新賦值,并且第二次遇見function hello()會(huì)忽略,或者說(shuō)是直接提前了,總而言之,以上代碼實(shí)際上執(zhí)行順序是
function hello(){alert('hello');}hello = function() {alert('hello2')} hello();hello();?
就是這樣,然后我們?cè)诳磧啥未a,第一段比較簡(jiǎn)單是這樣: <script type="text/javascript">function hello(){alert('hello');}hello();</script><script type="text/javascript">function hello() {alert('hello2')}hello();</script>?
得到預(yù)想結(jié)果,hello 和hello2,不同就是拆成了兩塊,而代碼是一塊一塊執(zhí)行的。前面已經(jīng)提到。 然后下面這一段需要深入仔細(xì)的看看,和思考哈哈。 <script type="text/javascript">var hello = function () {alert('hello');}hello();function hello() {alert('hello2')}hello();</script>?
先不說(shuō)結(jié)果,猜猜是什么結(jié)果,是不是有人會(huì)以為第二次從新賦值,結(jié)果不是和那一段代碼一樣嗎,錯(cuò)了,兩次都是hello,是前面的那個(gè)函數(shù)的值,原因其實(shí)很簡(jiǎn)單function hello()提前了,所以實(shí)際上是第一個(gè)函數(shù)覆蓋了第二個(gè)函數(shù)。
修改了一點(diǎn)東西,同時(shí)附上之前看到鏈接,其實(shí),現(xiàn)在看看,這東西還是有點(diǎn)怪怪,不過(guò)它還是挺重要,怎么說(shuō),至少要知道其實(shí)js解釋分兩次,有這感覺這對(duì)寫代碼時(shí)候是很有幫助:
參考:http://www.jb51.net/article/44123.htm
轉(zhuǎn)載于:https://www.cnblogs.com/wuweixin/p/4825934.html
總結(jié)
以上是生活随笔為你收集整理的javascript耐人寻味的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java 设计模式(3)单例模式
- 下一篇: BZOJ 1031: [JSOI2007