到目前為止,同學(xué)你知道了JavaScript的歷史,也了解其“你想是啥就是啥”的變量系統(tǒng)。相信憑借你深厚的Java或者C++功底,再加上程序員特有的自傲氣質(zhì),你肯定會(huì)信心滿滿:自信寫JavaScript毫無(wú)壓力。我也相信寫個(gè)Script對(duì)于后端攻城師們那肯定不在話下。但是,當(dāng)結(jié)果匪夷所想的時(shí)候,你或許會(huì)一番吐槽:真TM見鬼了,會(huì)不會(huì)是什么bug?還是瀏覽器有問題?我的代碼邏輯沒問題啊......。就像如下代碼,你能說出結(jié)果是什么嗎? 

var a=123;var b=999;function func(a){    var b;
  console.log(a);//?????? 結(jié)果是什么????留著分析
  var a=888;
  c=1111;function a(){
      }    console.log(a);//?????? 結(jié)果是什么????留著分析
  console.log(b);//?????? 結(jié)果是什么????留著分析
  console.log(c);//?????? 結(jié)果是什么????留著分析}func(456);

  是的,你的代碼沒有問題,當(dāng)然瀏覽器也沒問題。你或許說我才不會(huì)寫得滿屏都是“a”的代碼!講真的,當(dāng)你看到這段代碼的時(shí)候,你有沒有想過為什么JavaScript能夠這樣重復(fù)定義同名的變量?本樓敢打賭十個(gè)看客中,能有一個(gè)提出這個(gè)疑問,那已經(jīng)是驚喜了??赡苡腥藭?huì)說“因?yàn)樗侨躅愋脱哉Z(yǔ)”,這個(gè)答案只能說對(duì)了一半。這看似很不科學(xué)、很不嚴(yán)謹(jǐn)?shù)淖兞慷x,怎么能夠運(yùn)行起來(lái)呢?很明顯不科學(xué)。答案是:有人動(dòng)了你的代碼!

  有人動(dòng)了你的代碼!有人動(dòng)了你的代碼!有人動(dòng)了你的代碼!重要的事說三遍!那是誰(shuí)動(dòng)了你的代碼呢?故事又開始了。

  這事還得回到九十年代JavaScript出生那會(huì)。話說布蘭登-艾奇當(dāng)時(shí)創(chuàng)造JavaScript的時(shí)候,他的需求就是做做客戶端的數(shù)據(jù)驗(yàn)證而已。于是乎,他想“這玩兒沒必要搞高能設(shè)計(jì),看上去好像也沒有什么地方需要高能運(yùn)算的,搞預(yù)編譯、鏈接器那是太浪費(fèi)了,再說這玩兒是在瀏覽器上跑的,搞編譯器、鏈接器,那瀏覽器不成了IDE啦?最好能像Perl那樣,邊解析邊運(yùn)行最美不過”。鞋同們看到這里應(yīng)該明白了:那么多廢話,你就不是為了說JavaScript是邊解析邊運(yùn)行的嘛!我懂的,這個(gè)課本上有說。但是好多課本好像只說了邊解析邊運(yùn)行,但是沒說是怎么解析的,就算有說了,那也是廢話比這篇博文還多,還說不清楚。到此,前面高呼三聲那個(gè)問題的答案,想必看官到此也看出答案了:解析器動(dòng)了你的代碼!

網(wǎng)友評(píng)論