JavaScript的範圍問題

來源:互聯網
上載者:User

標籤:javascript   範圍   設計   解決   

JavaScript範圍應該是JavaScript裡面最難理解的概念了。看了《JavaScript進階程式設計》和其他的書雖然費了很大力氣看懂了,感覺解釋的還是有點費解。正好在網上看到幾個面試題可以用範圍解決,也方便了對它的理解。

1.JavaScript是單線程程式

和其他語言當初設計的時候不一樣,JavaScript是單線程(一個時機段內只幹一件事情),是不支援並發這個概念的。為什麼會這樣呢?可以這樣理解,假如一個線程正在建立DOM對象,然後下面一個線程將DOM對象刪除了,這樣矛盾嗎?另外一個問題就是現在很火的Node也是單線程。非常重要的是JavaScript的單線程對頁面解析而言,從上到下。傻瓜式的執行。

2.JavaScript預解析機制

先來看一個程式的執行結果:

alert(a);//function a(){alert(4);}var a = 1 ;alert(a);//1function a(){alert(2);}alert(a);//1var a = 3 ;alert(a);//3function a(){alert(4);}alert(a);//3

JavaScript解析器在解析的代碼的時候可以簡單的分為兩個步驟(結合上述代碼):
第一步:遍曆代碼尋找var變數、function函數、參數
a.將所有的var變數設定為undefined

  • a = undefined

b.將所有的函數體賦值給函數指標

  • a = function a(){alert(2);}
  • a = function a(){alert(4);}

c.整合上述兩個步驟,其中+-*/%等具有運算功能進行賦值,後面的會覆蓋前面的,所以上面的a、b兩個步驟執行完過後就剩下:

  • a = function a(){alert(4);}

第二步:漸進式掃描代碼
在漸進式掃描的過程中,會隨時查看第一步中計算的結果a = function a(){alert(4);} 同時我們知道運算子具有賦值功能,會修改變數的值,而函數不具有賦值的功能。執行第一行代碼alert(a)發現第一步執行結果是a = function a(){alert(4);}所以alert(a)的結果是 function a(){alert(4);}掃描第二行var a = 1; 發現有=具有賦值功能可以修改變數的值從而將a變數修改為var a = 1;掃描第三行發現現在有var a = 1;所以alert(a)結果是1,掃描第四行代碼function a(){alert(2);}發現是函數所以沒有賦值的功能。無法修改變數的值。所以第五行代碼alert(a)的執行結果是1。掃描第六行代碼var a = 3 ;所以變數a被修改為var a = 3 ;第七行代碼執行結果是3;掃描第八行代碼發現是函數function a(){alert(4);}無法修改變數的值,所以下面alert(a)執行的結果是3,上面整個流程就分析完了。

(這裡不探討所謂的文法、詞法這些編譯原理方面的知識)

3.JavaScript範圍鏈的簡單理解

先看下面這個筆試題目:

var str = ‘jQuery‘;function fun(){     alert(str);//jQuery     str = ‘JavaScript‘; } fun(); alert(str);//JavaScript

按照上面將的兩步方法進行分析,第一步:先找var變數、function函數、參數

var str = undefined
fun = fun(){………..}

第二步:漸進式掃描代碼第一行將變數str修改為var str = ‘jQuery‘;第二行行數沒有賦值功能,第六行是函數調用,只要發生函數調用,繼續第一步尋找變數、函數和參數,發現沒有var變數函數和參數,這個時候將向函數外層尋找變數,這就是範圍鏈的概念,裡面沒有繼續向外層尋找變數。發現有變數var str = ‘jQuery‘;所以結果是jQuery,向下執行代碼str = ‘JavaScript‘操作符號可以進行賦值,發現外部有str同名變數所以有var str = ‘JavaScript‘,所以最後一行執行結果是JavaScript

以上就是今天的內容,內容不多但是不是很好理解。建議多分析多思考。和實際案例結合。。。實踐出真知!


相關文章
  • JavaScript 開發進階:理解 JavaScript 範圍和範圍鏈
  • javascript變數的範圍



非常高興和大家交流學習
自由轉載,創意許可,請文章來源,來自這裡
(http://blog.csdn.net/unikylin)

JavaScript的範圍問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.