正確理解JavaScript

過去幾年我注意到技術圈一個很奇怪的現象,有太多程序員將那些他們只是有過非常淺顯的了解, 但其實根本就不懂的技術寫到他們的簡歷中,這個現象幾乎每種語言都有,但這其中最嚴重的就要數javascript了。

你不知道你不懂

出現這種狀況的一個很大的原因就是現如今幾乎每個開發者的工作都或多或少要依賴于javascript, 但大多數人并不真的理解這門語言,他們常用的學習方式是復制粘貼,使用這種方式, 你永遠不會真正學會這門語言,而只能得到一個你已經懂了的假象。

根據我過去幾年學習和使用javascript的經驗,在你了解之前,你不會知道你其實不懂, 這聽起來有點繞,你真正需要的就是有個人來告訴你你其實不懂,你需要全面系統的學習。 我經常面試一些自豪的將javascript列在他們簡歷中的家伙,但他們通常也就只能做個簡單的onClick處理或是表單驗證。 使用jQuery或者Dojo這樣的框架當然沒什么問題,但是除非你能了解隱藏在這些框架之后的javascript技術, 否則你不可能真正的掌握這些工具包的能量所在,下面就是我劃分的從低到高的javascript知識點, 分為基礎,中級和高級3個部分,看看你知道多少:

javascript的基礎知識

  • 知道基本的編程語法,比如循環,判斷,try/catch等等 * 理解包括多種函數定義以及賦值的方式,包括匿名函數
  • 理解基本的命名空間,全局(window)空間以及對象空間(不包括閉包)
  • 理解上下文的角色以及this變量的使用 * 理解各種對象以及函數的初始化和聲明方式
  • 理解javascript比較操作符,如<, >, ==, ===,以及對象和字符串比較的原理和對象映射 * 理解對象屬性和函數的數組索引,以及這和真實的數組之間的區別。

javascript中級知識

* 理解定時器,以及它的工作原理,包括何時以及如何使用定時器來異步執行方法調用

  • 關于回調的深度支持,以及如何通過call和apply方法來控制上下文和函數參數傳遞
  • 理解JSON標記以及eval函數 * 理解閉包以及他們如何影響你的代碼效率
  • AJAX以及對象序列化

javascript高級知識點

  • 理解方法的”arguments’變量,包括如何使用它來通過arguments.length重載函數,以及通過arguments.callee來進行遞歸調用,需要注意使用這個特性有一定的危險性,因為ECMAScript 5 的Strict模式不支持此功能,但jQuery和Dojo都用到了它。
  • 高級閉包比如 self-memoizing函數,partially applied函數,以及最可愛的 (function(){})()調用。
  • 函數以及HTML prototype,prototype chain,以及如何使用基本的javascript對象和函數(比如Array)來簡化代碼。
  • 對象類型以及instanceof的使用 * 正則表達式和表達式編譯
  • With語句以及為什么不要使用它們 * 最困難的部分,知道如果利用所有這些工具,并產生處干凈,整潔,健壯,快速,可維護以及兼容不同瀏覽器的代碼。

這里的最后一點特別重要并且也是最難實現的,因為javascript天生不夠嚴格的語法, 你的程序很容易就會變成意大利面條式的難以維護的災難代碼,一旦你開始學習javascript語言本身, 你只能通過在大型的Web程序中不斷實踐才能真正掌握它,這可能要花好幾年的時間, 并且你沒法從書本上學到這些,我自己每天使用javascript好幾小時,已經好幾年了, 但我還是在不斷尋找更好的方式來編寫和重構我的代碼,出于這個原因,一開始就使用jQuery這樣的框架會很危險, 它會很容易讓你的代碼變得不可維護,Dojo的Class和Package系統則多少會幫上點忙。

考慮到javascript現在已經通過Node.js這樣的項目滲透到了后端,我決定將和Web相關的部分單獨拉出來講講, 也就是說,如果你想要在Web開發中使用javascript,那么下面這些就是每一個優秀程序員都應該了解的:

  • 如何高效的操作Dom(添加,刪除以及更新),還有如何通過使用document fragments這樣的工具來最小化瀏覽器的re-flows。
  • 夸瀏覽器的DOM元素屬性提取(比如,style,position等等),jQuery和Dojo都可以很好的完成這些工作,盡管如此,理解從CSS和style標簽中提取屬性的差異,以及如何計算position和size還是很重要的。
  • 夸瀏覽器的事件處理,綁定,反綁定,冒泡,以及如何取得期望的回調上下文。在一次,現成的框架也可以很好的處理這些事情,但是你應該對IE瀏覽器和W3C標準瀏覽器之間的不同有所了解。
  • 正則表達式選取DOM節點 * 瀏覽器功能檢測以及智能降級

就像你從上面的列表中看到的,對于javascript,除了alert(myval)或者myBtn.οnclick=…, 你還需要了解更多東西,這些都是粘貼復制無法學到的,只有通過閱讀和練習, 你才能成為一名真正的javascript程序員。

這里推薦兩本關于javascript的好書,”the good parts”和”javascript忍者的秘密”, 如果你只是為了裝飾簡歷,我建議你至少也要搞懂基礎階段的那些知識點,并且至少嘗試過中極階段的那些技術。 一旦你發現當你開始自己開發你想要的功能,而不是從其他人那里拷貝粘貼時,你就可以宣稱自己懂javascript了, 在那之前,請先別這樣說。

如果我錯過了什么關于javascript的概念,歡迎給我留言,同時也別忘了分享任何你關于JS或者其它語言的經驗。

需要說明的是我并不是一個前端開發者,我實際上是一個后臺開發者,但是因為形勢需要, 漸漸變成了一個全協議棧的開發者,現如今,幾乎每個后端開發者都需要了解javascript, 這也是我寫這篇文章的目的,我并不是想表達我對javascript有多了解, 我只是想說javascript是一門非常強大和龐雜的語言,它遠比你第一眼看到的要復雜

本文翻譯自”You Don’t Know javascript”(http://www.w2lessons.com/2011/04/you-dont-know-javascript.html), 作者:Michael Woloszynowicz(http://twitter.com/mwbiz)。

轉載于:https://www.cnblogs.com/HHJ-XX/archive/2013/04/28/3048841.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376717.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

醫療機構遠程視頻監控集中管理,貝銳蒲公英提供一站式解決方案

上海某企業專業致力于醫療軟件、家居智能化研發、設計、銷售、集成及實施&#xff0c;企業主營業務之一為醫療軟件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系統等方面的醫院信息化建設。 在實際應用、部署過程中&#xff0c;需要實現各地區分院與總院間的數據庫互相訪問、視頻數…

py腳本:linux系統下定時清理文件

linux清空文件內容的三種方法&#xff1a; 1.使用vi/vim命令打開文件后&#xff0c;輸入"%d"清空&#xff0c;后保存即可。但當文件內容較大時&#xff0c;處理較慢&#xff0c;命令如下&#xff1a; vim file_name :%d :wq2.使用cat命令情況&#xff0c;命令如下&a…

Process類:啟動和停止本地系統進程

Process.Start 方法 (String, String) 通過指定應用程序的名稱和一組命令行參數來啟動一個進程資源。&#xff08;并將該資源與新的 Process 組件相關聯&#xff09; 如果沒有啟動資源&#xff0c;則返回null Process.Start("d:\\0.jpg"); Process.StartInfo 屬性 獲…

NYOJ2括號配對問題

括號配對是最基本的棧的問題&#xff0c;它是棧入門的經典題目&#xff0c;思路是&#xff0c;如果是左括號直接進棧&#xff0c;如果是右括號&#xff0c;這時就要比較棧頂的元素與他是否匹配&#xff0c;如果匹配則出棧&#xff0c;否則進棧&#xff0c;下面是代碼的實現&…

SVC編碼簡單了解

基本概念 可伸縮視頻編碼 SVC&#xff08;Scalable Video Coding&#xff09; 作為 H.264 標準的一個擴展,可用于生成不同幀率、分辨率和質量等可分層的視頻流。 基本層編碼最低層的時域、空域和質量流&#xff1b; 增強層以基本層作為起始點&#xff0c;對附加信息進行補充&a…

程序集系統重構機房收費系統——起步

這段間時一直在查找程序集系統之類的問題,在現正好有機會和大家同享一下. 開始機房收費系統重構也半個月過去了。但看自己的系統連一個簡略的登錄還沒有實現。自己不免有些羞愧了。近來自己的習學態狀總的說來還是不錯的。但是由于自己對來原的識知把握的欠好所以致導了自己不知…

ie下的透明度,用濾鏡filter:alpha

.box{ width:100px; height:100px; background-color:#000; filter:alpha(Opacity50); opacity: 0.5; } 轉載于:https://www.cnblogs.com/liujinyu/p/3931087.html

mysql 修改字段類型

修改字段類型&#xff1a; alter table 表名 modify column 字段名 類型。 --如 alter table province_quality modify column quality float(8,2); mysql> describe province_quality ; --------------------------------------------------- | Field | Type |…

Ubuntu硬盤優化,降低硬盤溫度(Acer V5 親測成功 )

1.安裝laptop-mode-tools sudo apt-get install laptop-mode-tools2.修改電源管理配置: laptop-mode.conf sudo vim /etc/laptop-mode/laptop-mode.conf修改配置文件&#xff1a; #有關參數的說明請參照文件里的注釋說明 ENABLE_LAPTOP_MODE_ON_AC1 #當筆記本使用交流電時也開啟…

XmlSerializer 對象的Xml序列化和反序列化,XMLROOT別名設置

這篇隨筆對應的.Net命名空間是System.Xml.Serialization&#xff1b;文中的示例代碼需要引用這個命名空間。 為什么要做序列化和反序列化&#xff1f;.Net程序執行時&#xff0c;對象都駐留在內存中&#xff1b;內存中的對象如果需要傳遞給其他系統使用&#xff1b;或者在關機時…

C++智能指針使用指南 part2:智能指針本身的方法以及使用建議

目錄往期文章智能指針本身的方法對于unique_ptr對于shared_ptr對于weak_ptr使用建議1、使用工廠函數而非new構造對象2、在類內部調用其他類的方法3、在某類內部將當前對象指針共享給其他對象4、 智能指針只能管理堆對象&#xff0c;不能管理棧上對象5、不能將this指針直接托管給…

“/”應用程序中的服務器錯誤。

運行時錯誤 說明: 服務器上出現應用程序錯誤。此應用程序的當前自定義錯誤設置禁止遠程查看應用程序錯誤的詳細信息(出于安全原因)。但可以通過在本地服務器計算機上運行的瀏覽器查看。 詳細信息: 若要使他人能夠在遠程計算機上查看此特定錯誤消息的詳細信息&#xff0c;請在位…

JAVA_Collection容器

因為項目的需要&#xff0c;今天抽時間把JAVA中的容器復習了一下&#xff0c;為了以后的不時之需&#xff0c;現在把它記下來。 容器有其名&#xff0c;知其意&#xff0c;用來盛放數據的集合&#xff0c;JAVA中為我們提供了三種容器類&#xff1a;set、list、map&#xff0c;三…

對于enable_shared_from_this、shared_from_this使用筆記

文章為轉載匯總 參考&#xff1a;C11標準庫的一個工具類enable_shared_from_this的作用及原理分析 從這篇文章中可以知道&#xff1a; 當一個類public繼承enable_shared_from_this時&#xff0c;會獲得一個共有方法shared_from_this&#xff1a; class T : public enable_shar…

db file sequential read 事件的優化(一)

db file sequential read 事件的優化&#xff08;一&#xff09; db file sequential read等待事件有3個參數&#xff1a;file&#xff03;&#xff0c;first block&#xff03;&#xff0c;和block數量。在10g中&#xff0c;這等待事件受到用戶I/O等待級別的影響。當處理db fi…

2014-08-26 遇到的小問題

不能快速的保存bug的確是很不爽的事情 &#xff0c;不僅客戶著急 領導也著急 &#xff0c;自己也著急。。。。。。。。哈哈 原來好好的一個平臺 簡單的一個插入記錄 突然就報錯了 錯誤為 could not insert #9521 原來項目是用 NHibernate 做的插入 拋出的異常 真是無法定位到底…

Fatal error: Please read “Security“ section of the manual to find out how to run mysqld as root

.通過在命令后面加上–userroot 進行強制使用root賬號啟動。 cd /etc/init.d mysqld --userroot 參考&#xff1a; https://blog.csdn.net/huo_wa/article/details/117550307?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECT…

取消cp別名'cp -i'(unalias)

在rhel4updae8系統是使用cp命令覆蓋文件總是提示要輸入yes或no&#xff0c;即使加上-f參數也無法強行覆蓋。[2] 方法一&#xff1a; 輸入alias命令&#xff0c;看到系統內部使用的是cp的別名。 #alias alias cpcp -i 輸入unalias cp命令&#xff0c;解除別名。 unalias cp #&…

增加swap分區

在確定了服務器所需要使用的內存后&#xff0c;需要增加1024M的swap空間 具體操作&#xff1a; 1、dd if/dev/zero of/tmp/swap bs1M count1024M #創建1024M的文件塊 2、mkswap /tmp/swap #創建swap文件 3、swapon /tmp/swap #激活swap文件 4、swapon -s #查看swap 5、修改…

python 實現 topk算法

這里的版本是針對的一個class的某一個成員變量進行的&#xff1a; 關于如何定義對象的比較方法&#xff0c;請參考往期文章&#xff1a;python定義對象的比較方法 class province_room_quality_data:def __init__(self, room, quality):self.room roomself.quality qualityd…