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

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

  是的,你的代碼沒有問題,當然瀏覽器也沒問題。你或許說我才不會寫得滿屏都是“a”的代碼!講真的,當你看到這段代碼的時候,你有沒有想過為什么JavaScript能夠這樣重復定義同名的變量?本樓敢打賭十個看客中,能有一個提出這個疑問,那已經(jīng)是驚喜了??赡苡腥藭f“因為它是弱類型言語”,這個答案只能說對了一半。這看似很不科學、很不嚴謹?shù)淖兞慷x,怎么能夠運行起來呢?很明顯不科學。答案是:有人動了你的代碼!

  有人動了你的代碼!有人動了你的代碼!有人動了你的代碼!重要的事說三遍!那是誰動了你的代碼呢?故事又開始了。

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

網(wǎng)友評論