- 看透JavaScript:原理、方法與實踐
- 韓路彪
- 2848字
- 2020-11-28 15:50:41
1.2 JavaScript的學習方法
“治大國若烹小鮮”,按照中國的傳統文化來講應該是一通百通。雖然上文介紹的是看地圖的方法,但是同樣適用于JavaScript以及其他知識和技術的學習。
對于學習JavaScript來說,大致也有跟看地圖類似的三種學習方法。第一種是先找到像字典一樣的JavaScript資料,然后從頭到尾一點一點看;第二種是在遇到問題后直接尋找解決方案;第三種是先整體思考JavaScript是什么、怎么實現的及學習JavaScript的目的,然后再有目標地進行系統學習,最后在腦子里建立起一個整體的框架,并且弄明白每個地方的實現原理,這樣就差不多了,當然更重要的是多實踐多總結。
對于前兩種方法,本書就不多說了。第三種方法雖然看起來很復雜,但是只要大家跟著本書來學習,應該會覺得很輕松,而且在學習完之后對JavaScript的認識應該也會有質的提升,再使用JavaScript的時候會得心應手。
對于第三種學習方法來說,首先要明白為什么需要JavaScript(或者說JavaScript是怎么提出來的)、JavaScript是什么、有什么用,以及它的結構是什么樣的?對于這些問題本書將在接下來的兩章中給大家介紹。這里先給大家介紹JavaScript的三點特性,讓大家對JavaScript有一個整體的認識。
1.2.1 JavaScript是一種面向對象的語言
要理解面向對象首先要明白什么是對象。網頁中的一段文字、一個文本框、一張圖片、一個樣式表規則以及瀏覽器的導航器等都是對象。另外,JavaScript中也有為了方便操作自身提供的對象,而且可以自定義對象,JavaScript中的函數其實也是一種對象。JavaScript的目的就是要操作這些對象,例如,“把某個文本框的內容清空”,這就是對這個文本框對象進行操作,再例如“返回上一頁”就是對導航器這個對象進行操作。只不過JavaScript不是中國人開發的語言,所以它并不認識上面的語句,要想操作某個對象,就必須使用JavaScript所規定的語句才行。從這里可以看出學習JavaScript主要包含以下三方面內容。
? JavaScript怎么操作對象。
? JavaScript中都包含哪些對象,每一類對象都有些什么功能。
? 不同對象之間是什么關系。
1.2.2 JavaScript是一種腳本語言
腳本語言的功能是修改或者稱為“操作”,而不是創造,所以,JavaScript并不能從無到有創建出來一個頁面,而只能是對頁面進行修改(有的讀者可能會覺得JavaScript可以在一個空白頁面上隨意寫內容,但那只是對頁面進行修改,頁面本身是由瀏覽器創建的,打開新頁面也是類似的道理,如果沒有瀏覽器,JavaScript自己是創建不出來頁面的)。因此,JavaScript并沒有類似于其他語言的入口函數main,真正的入口函數main在瀏覽器程序中。
腳本語言是一堆命令的集合,一般來說會有一個解釋器,由其負責從頭到尾一條一條語句進行解釋,然后根據解釋后的語句含義進行操作。例如“給頁面內所有文本框添加一個內容變化監聽函數XXX”,如果解釋器可以理解這句話,那么它會找到所有文本框,然后添加監聽函數,這就叫解釋執行。它是由解釋器將內容翻譯后根據其含義進行相關操作的,即操作最終是由解釋器來完成的,而不是將腳本編譯為機器碼來執行的。
JavaScript是一種比較復雜的腳本語言,它跟編譯型語言一樣也有自己的變量、函數,其執行過程跟編譯器一樣首先生成語法樹,然后解釋器生成一條一條的中間碼(類似于“給頁面內所有文本框添加一個內容變化監聽函數XXX”這樣的語句,當然不會是中文,甚至不一定使用文字,只要描述出來含義就可以),最后一條一條執行。
當然,隨著前端的功能越來越復雜,如果純粹按照上述方法來解釋執行就會嚴重影響效率,所以后來有的解釋器(這里嚴格來說已經不能稱為解釋器了,現在通用的叫法為JavaScript引擎),例如JavaScriptCore、SpiderMonkey會將使用得比較頻繁的代碼直接編譯為CPU所執行的機器碼,有的引擎(例如V8)甚至會將所有JavaScript代碼全部編譯為機器碼,這樣就類似于編譯型語言了。不過,JavaScript引擎還是會在加載網頁的時候直接下載源代碼,然后編譯,最后執行,這對編譯速度的要求就更高了。對于我們來說,并不需要過分關注其底層是怎么實現的,只需要明白JavaScript腳本是用于表述對各種對象怎么操作的一種描述就可以了。
1.2.3 JavaScript是一種事件驅動的語言
事件驅動是指JavaScript引擎并不是在看到代碼之后就會立即執行,而是會在合適的時間才去執行。這個合適的時間是指當某個事件發生之后(例如一個輸入框的內容發生了變化,這就是一個事件)。只有當相應的事件發生了之后,相應的操作才會執行,這就是事件驅動。事件驅動在我們的日常生活中也是比較常見的一種模式。例如,銀行的營業員處理業務就是一種事件驅動的模式,只有客戶到來的時候才需要提供服務,客戶到來就是一個事件。
事件驅動包含三個關鍵內容:事件、事主和處理方法。對于上述銀行的例子來說,客戶要辦理的業務是事件,營業員是事主,而具體每項業務怎么辦理就是處理方法。例如,一個客戶找到營業員甲辦理存款業務,那么事件是存款,事主是營業員甲,處理方法是營業員具體辦理存款的操作,而客戶只是觸發了這一事件。對于每個營業員來說,在上崗前都需要進行培訓,培訓在事件模型里就是綁定事件。例如,營業員甲負責存取款業務,營業員乙負責開戶辦卡業務,這就相當于營業員甲綁定了存取款事件,營業員乙綁定了開戶辦卡事件,對于沒有綁定的事件是無法處理的,就像找營業員甲開戶是不可以的。另外,對于同一事件不同的營業員的處理方式也可能不一樣,就像同樣是開戶,但是不同銀行的營業員的開戶方式可能就不一樣。
在事件模型中,我們所要做的就是給需要處理事件的事主綁定處理方法,就像給營業員進行業務培訓一樣,綁定完事件之后,其他的事情就不需要我們參與了。雖然底層的實現不需要我們來參與,但是明白了底層的實現原理,可以讓我們對事件驅動理解得更加深刻。
事件驅動模型在底層一般都是通過隊列來實現的,這與在銀行窗口前排隊差不多。當發生一個事件時就會將其排入隊列中,其中寫清楚事件是什么、事主是誰,然后事件管理器定時查看隊列,如果隊列中有事件,那么事件管理器就會找跟事主相關的此類事件的處理方法,如果找不到,該事件就會被丟棄,如果找到就會執行相應的處理方法。這跟銀行的排隊稍微有點區別,銀行的排隊是直接排在各自事主(營業員)前面,而事件驅動模型中所有的事件都排在一個隊列里,這就像到銀行辦業務的人都排成一個長隊(類似于取號排隊,但是不分業務,全部排在一起的那種),然后大堂經理負責安排業務,排隊的人需要告訴大堂經理準備到哪個窗口、辦理什么業務。當然,直接按照銀行的排隊模型來實現從技術上來說并非不可以,而且在有的地方確實就是這么實現的,這只是業務和設計的問題。另外,這里所說的只是原理,具體怎么實現還要看開發者是如何設計的,例如,也可以直接將事件處理方法的地址保存到隊列中。
理解了事件模型,我們就能明白JavaScript中的代碼雖然是用于描述怎么操作對象的,但是并不一定要立即操作對象。
現在從宏觀上明白這三點就可以了,至于JavaScript具體是怎么描述對對象的操作、怎么創建對象、自身包含哪些內置對象、對象之間有些什么關系等內容,隨后整本書將進行詳細介紹。大家帶著這些問題去學習接下來的內容,這樣學起來會更加輕松,而且也能夠理解得更加透徹。
當然,這里介紹的學習方法,接下來還需要大家自己去使用、實踐,只有這樣才能真正受益,否則僅是學了一種方法而已。例如,雖然筆者知道地圖怎么看,但是因為沒在這上面花太多精力,所以對很多具體的地圖并不熟悉。
- ClickHouse性能之巔:從架構設計解讀性能之謎
- ReSharper Essentials
- Java系統分析與架構設計
- Android Development with Kotlin
- PHP+MySQL網站開發技術項目式教程(第2版)
- Java Web基礎與實例教程
- Blender 3D Incredible Machines
- PLC應用技術(三菱FX2N系列)
- 小程序,巧應用:微信小程序開發實戰(第2版)
- 一步一步跟我學Scratch3.0案例
- Python 3 Object:oriented Programming(Second Edition)
- SEO教程:搜索引擎優化入門與進階(第3版)
- Qt 5.12實戰
- Practical Responsive Typography
- Visual Basic 開發從入門到精通