奇舞js筆記——第0課——如何寫好原生js代碼

來源:互聯網
上載者:User

標籤:重新整理   js代碼   可擴充   複雜度   狀態   traffic   cti   原因   分離   

摘要

 

 

1.好的代碼職責要清晰,javscript不要用來操作樣式;

 

2.API要設計的合理:通用性,適度的抽象(資料抽象,過程抽象),可擴充性;

 

3.效率問題:用好的、合適的演算法(前端程式員要把自己當程式員)。

 

註:

 

1.學習視頻地址

2.ppt地址

3.個人感想:

   是我hin厲害的師父推薦我看的月影大大的視頻,感覺對於我這個小白來說,真的是一遍又一遍的重新整理知識面。我覺得像月影大大這種大佬的思路,我接觸之後真的是受益匪淺。

  所以我總結出來不僅是自己記筆記,也是想分享給想要成為真正的前端“工程師”的前端er。

  真的很珍惜這種知識面被重新整理的感覺——越學習,越感到自己無知,共勉。

 

 

目錄

 

 

1. 問題一:操作DOM 

    版本1,初級工程師: 

    版本2,中規中矩: 

    版本3,專業版: 

    操作DOM問題的總結: 

2.問題二:API的設計 

    版本1: 嵌套setTimeout

    版本2: 資料抽象

    版本3:資料抽象,封裝(七八十分)(一定要會)(中規中矩)(項目中用起來不錯)

    版本4:過程抽象(版本2和3是資料抽象) 

    版本5: 改需求,改時間 的對策

    版本6:(進階程式員寫的) 

    API設計問題總結: 

3.問題三:效率/效能問題

    版本1:兩個迴圈 

    版本2:利用數組的排序方法sort,先排序,再遍曆 

    版本3:空間複雜度換時間複雜度 

    效率問題總結

4.總結

 

本文

 

 

1. 問題一:操作DOM

做一個列表單選

 

版本 1,初級工程師

 

優點:

在ul上添加事件控制代碼,由於事件可以冒泡,在點擊事件中篩選event.target來處理就可以

問題:

js負責的是“行為”

在js中定義樣式,若需求改動後,會導致不靈活

js:不操作DOM樣式,操作DOM狀態

 

版本2,中規中矩:

 

 

分清職責:

css中添加樣式類

js來操作狀態(類屬性)

 

版本3,專業版:

 

這樣實現,充分利用html標準,更具有語義性,靈活

 

操作DOM問題的總結:

1.寫 JavaScript 操作 DOM 要注意什麼

不要操作DOM樣式

(很多wvvm架構禁止直接在js中操作DOM的原因就是這個,害怕寫出版本1那種代碼)

2. JavaScript 與 HTML、CSS 的職責如何分離

html負責內容,語義

css負責樣式

js負責狀態,不負責樣式

3. 把複雜性放在哪一頭,為什嗎?

4. 架構?原生?:

架構幫你解決了代碼寫的不好的問題,一旦用慣了,再換架構,會寫出問題很多的代碼;

寫原生的更能意識到自己的問題;

 

2.問題二:API的設計

三個狀態用紅(stop)、綠(pass)、黃(wait)表示

要求用 JavaScript 讓三個狀態輪流切換

每個狀態的停留時間是 2 秒

 

版本 1:

 

css:

 

優點:

html,css中把三個狀態類”stop”,”wait”,”pass”放在父元素上,然後在css中直接用:nth-child操作父元素的某個子項目,這樣靈活性很高

缺點:

如果需求增加到 5 盞、10 盞燈?

const traffic = document.getElementById(‘traffic‘);(function reset(){  traffic.className = ‘wait‘;  setTimeout(function(){      traffic.className = ‘stop‘;      setTimeout(function(){        traffic.className = ‘pass‘;        setTimeout(function(){          ...            ...              ...                ...                  setTimeout(reset, 2000)                ...              ...            ...          ...        }, 2000)      }, 2000)  }, 2000);})();

過程耦合 + Callback Hell…… 差評!!!:

代碼中,三個狀態有順序,必須先1再2再3,過程耦合;

Callback Hell難以維護

 

版本2:

 

優點:

把狀態抽取出來,通過數組的下標去操作,更改資料很方便

把資料/狀態抽象出來

缺點!!:

依賴於外部變數 stateList、currentStateIndex

封裝性不好……差評!!

 

版本 3:封裝好(七八十分)(一定要會)(中規中矩)

 

 

優點:

把currentStateIndex分裝進函數,因為使用者使用不到;

把state的數組和dom元素暴露出來,以便更改;

很重要:::::什麼該暴露,什麼該封裝

缺點:

可複用性差,只有當前的能用到

 

版本4:( 過程抽象 )(版本2和3是資料抽象)

 

 

抽象出來了一個poll 函數是一個高階函數(偏函數),傳回值是function,說明做了一個過程抽象。

它的參數是一系列函數,傳回值也是函數,它的功能是按順序調用參數中的函數。

小王去開門:person類,是資料抽象;開門,開xx,是過程抽象

bind函數也是一個高階函數(偏函數),它也返回一個函數,

優點:poll函數可複用,很通用。

例如:

 

 

版本5:改需求:改時間

版本2.3.4做了抽象反而不能改時間,版本1可以改,要回去???

 

promise(是es6裡面很重要的概念)

不用promise的版本:

 

 

版本 6:(進階程式員寫的)

 

內部實現很複雜,但是外部API很好用;可以隨意向狀態列表添加狀態,且每個狀態裡面可以做很多種事情;

 

API設計問題總結:

1.寫原生的js有很多方向可以寫,但是用架構類庫模式會很固定

2.避免過程耦合,即上下兩個過程有關聯(例如版本1中,必須先實現狀態1,再狀態2...)

3.要知道什麼資料該封裝,什麼不該封裝(例如例子中的currentIndex該封裝,因為只有在內部實現時要用到它,而狀態列表,元素,不該封裝,因為與具體的過程實現沒關係,而是與外部介面有關係)

4.可複用的過程可以抽象出來(例如例子中的按順序執行幾個行為)

5.與過程無關的資料可以抽象出來(例如例子中的三個狀態,等待時間)

 

 

3. 問題三 :效率/效能問題:

 

版本1:兩層迴圈

 

效率:兩層迴圈,時間複雜度是O(n^2),效率很低

 

版本2:利用數組的排序方法sort,先排序,再遍曆

 

 

效率:

排序時間複雜度n*log(n),遍曆複雜度是O(n)

總的就是O(n*logn+n)

如果數組很大的話,效率高很多,比如n=10000

n^2=100000000,n*logn+n=50000

 

版本3:空間複雜度換時間複雜度

(大致思路就是將1和9中的1放在key上,另一個放在value上)

 

效率問題總結:

1.程式最佳化本質上是要用好的演算法,要重視演算法問題,尤其是在js不止被用在瀏覽器上時(例如用在服務端時,比如處理圖片就要處理大量的像素點,所以演算法很重要,可以在leetcode刷題,前端在程式員比鄙視鏈上,要正式這個問題,別把自己不當程式員)

2.其他最佳化要瞭解:http協議特點,資源請求特點,圖片格式

 

4.總結:

1.好的代碼職責要清晰,javscript不要用來操作樣式

2.API要設計的合理:通用性,適度的抽象,可擴充性

3.用好的、合適的演算法(前端程式員要把自己當程式員)

 

奇舞js筆記——第0課——如何寫好原生js代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.