摘要:事情是如何發生的最近干了件事情,發現了源碼的一個。樓主找到的關于和區別的資料如下關于拿來主義為什么這么多文章里會出現澤卡斯的錯誤代碼樓主想到了一個詞,叫做拿來主義。的文章,就深刻抨擊了拿來主義這一現象。
事情是如何發生的
最近干了件事情,發現了 underscore 源碼的一個 bug。這件事本身并沒有什么可說的,但是過程值得我們深思,記錄如下,各位看官仁者見仁智者見智。
平時有瀏覽別人文章的習慣,看到一篇關于 "函數節流" 的文章(具體是哪篇就不說了),不過很遺憾作者似乎并沒有搞清楚 throttle 和 debounce 的區別(或許根本不知道 debounce)。于是隨手 Google 了一下,發現大多數談 "函數節流" 的文章都會引用《高程三》中的經典代碼:
代碼本身并沒有問題,但是很可惜,函數名有問題,應該叫 debounce 而非 throttle,這就引發了我的思考,這個錯誤的概念,這段錯誤的代碼,為什么能夠 "流芳百世"?
throttle vs debounce由于篇幅以及主題的關系,本文并不會講 throttle 和 debounce 的具體用法以及區別等。(對此有興趣的朋友可以跟帖,人數多的話樓主會另開一文)
有些人可能會說,憑什么你以為的 throttle 就是 throttle,debounce 就是 debounce?這就要聊聊我對于 "理解某一個概念" 的方法。
就以 throttle 為例,某日,老師給你布置了一個作業,讓你深入理解一下 throttle,第二天上課來聊聊。張三心里非常高興,這個概念在經典書籍《JavaScript高級程序設計》中見過,打開一看,就兩頁,而且解釋地非常清晰,看完就高興地干別的事情去了。而李四,覺得高程三講的有點少,而去谷歌了下其他關于 throttle 的知識點,興奮地看到 throttle 函數的好幾種寫法,發現高程三只是用了最簡單的方式,還有更優雅運用場景更多的寫法,或許此時他已經發現和 throttle 同時出現的還有個 debounce,這是什么鬼?反正老師沒說,以后再看吧,于是心滿意足地玩游戲去了。而王五,和李四一樣發現了 debounce,這是什么?一起了解了吧,繼而發現 debounce 的用法居然和高程三中的 throttle 一樣!繼續挖下去,發現高程三中的 throttle 函數其實應該叫 debounce,看到最后,王五已經把 throttle 和 debounce 徹底理解了。
我們要做王五。
首先,我們并不能只聽一家之言。這里的一家是指 "個人",對于一些官方的文檔我們還是應該充分信任的。澤卡斯也是人,犯點小錯在所難免。
其次,我們對信息要做充分刪選。網上的信息大多魚龍混雜,出錯了也并不會對你負任何責任。那么如何能夠辨別出正確有用的信息呢?首先當然是看官方文檔,比如說要了解 HTTP 那么就去看官方的 RFC,要學習 jQuery 的話可以去官網 https://jquery.org/ 查查資料,這些一般都不會有什么問題。如果覺得官網資料晦澀難懂,可以試著去看看 Wikipedia 或者XX百科,維基的精確度被很多人噴過,樓主覺得還是值得一看的,如果看英文比較吃力的,就看看國內的一些百科。第三,就是瀏覽一些前人的文章了,這也是最普遍但是也最容易混淆概念的地方,所以我們要盡量挑一些權威的專家級作者(比如樓主,開玩笑啦^_^)。第四,如果還是覺得沒法理解,可以試著去一些問答社區,首推 stackoverflow,國內的話可以看看 segmentfault,知乎,看贊同多的回答,一般來說問題不大。
樓主找到的關于 throttle 和 debounce 區別的資料如下:
http://benalman.com/projects/jquery-throttle-debounce-plugin/
https://davidwalsh.name/javascript-debounce-function
https://css-tricks.com/the-difference-between-throttling-and-debouncing/
https://ict.ken.be/javascript-debounce-vs-throttle-function
http://stackoverflow.com/questions/25991367/difference-between-throttling-and-debouncing-a-function
關于拿來主義為什么這么多文章里會出現澤卡斯的錯誤代碼?樓主想到了一個詞,叫做 "拿來主義"。
很多人寫博客,只是為了寫博客而寫博客,隨便谷歌百度下,找到搜索頁前幾個鏈接,東拼西湊下,一篇新鮮的博文就誕生了,甚至都沒有自己寫 demo 測試下,就把代碼粘貼上去了,樓主對這樣的行為是嗤之以鼻的。以前寫過一篇文章,叫做 get與post需要注意的幾點,寫這篇文章的時候,看到過一篇叫做 GET和POST有什么區別?及為什么網上的多數答案都是錯的。 的文章,就深刻抨擊了 "拿來主義" 這一現象。很多知名的博主寫過文章來遍歷寫博客的好處,于是大家都紛紛效仿,為了寫博客而寫博客。對于樓主來說,寫博客是一種享受,通常寫一篇類似本文的博文需要花費 2~4 個小時,卻也樂此不疲,用心寫過博文的人都知道,寫一篇好的文章,需要花費大量的時間,而樓主身為一個完美主義者,每次寫完一篇文章,至少自己已經讀過十幾遍了,寫完之后還要讀個兩三遍才敢發表,所以很少有錯別字以及不通順的句子,但是 "拿來主義" 者則不然,簡單地拼接一些資料,就能生產一篇博文,在此,樓主呼吁大家,如果寫,請用心。
the bug of underscore很多談論 throttle 和 debounce 的文章,最后都會談到 underscore 已經將這兩個方法完美封裝,有的給個 underscore 的鏈接,有的直接上段代碼,很少有去深入看看它的實現的。樓主簡單地用了下 underscore 封裝的 debounce 方法,發現了 bug,建了個 issue https://github.com/jashkenas/underscore/issues/2478。
好幾個外國人表示并沒有重現我的 bug,最后我直接指出了代碼的錯誤之處,并給出了自己的 fix 方案(詳見 https://github.com/jashkenas/underscore/pull/2479),老外才認識到了代碼中的 bug,并進行了修復(雖然最后沒有采納我的代碼)。詳細的過程可以看上面的兩個鏈接里的內容,主要是和 underscorejs 兩個維護者之間的交流,最后從他們的更新來看應該是 test cases 寫錯了。
總結最后,樓主總結兩點:
對于知識點,請盡量查閱各種靠譜的資料,將其弄懂,不要一知半解
對于寫博客,請弄懂了再寫,不能誤人子弟;如果寫,請用心
最后的最后,希望大家能在 Github 上關注我,或者關注我的項目,我覺得 followers 多的話,也不會在發現 bug 的時候被維護者如此忽視了 ╮(╯▽╰)╭
Github:https://github.com/hanzichi 或者直接點擊頁面右上角,謝謝關注!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79042.html
摘要:函數節流和去抖的出現場景,一般都伴隨著客戶端的事件監聽。函數節流的核心是,讓一個函數不要執行得太頻繁,減少一些過快的調用來節流。 概述 也是好久沒更新 源碼解讀,看著房價蹭蹭暴漲,心里也是五味雜陳,對未來充滿恐懼和迷茫 ...(敢問一句你們上岸了嗎) 言歸正傳,今天要介紹的是 underscore 中兩個重要的方法,函數節流和函數去抖。這篇文章不會涉及具體的代碼實現(關于代碼實現請期...
摘要:節流保證在一定時間內,只能觸發一次。我們在嘗試一下去抖消抖,消除抖動,感覺這個更好聽有沒有什么現成的上的一次發現源碼的經歷以及對學術界拿來主義的思考函數節流和函數去抖應用場景辨析函數去抖的實現 開篇先提幾個問題? 1.做搜索框的時候你使用什么事件?change?blur?keyup?你想要的效果是什么? 2.scroll事件怎么就觸發?是滾一段距離觸發一次?還是滾一圈觸發一次?還是滾...
摘要:自己嘗試一下年在的文章中第一次看到的實現方法。這三種實現方法內部不同,但是接口幾乎一致。如你所見,我們使用了參數,因為我們只對用戶停止改變瀏覽器大小時最后一次事件感興趣。 前幾天看到一篇文章,我的公眾號里也分享了《一次發現underscore源碼bug的經歷以及對學術界拿來主義的思考》具體文章詳見,微信公眾號:showImg(https://segmentfault.com/img/b...
閱讀 1220·2021-11-25 09:43
閱讀 1976·2021-11-11 10:58
閱讀 1192·2021-11-08 13:18
閱讀 2686·2019-08-29 16:25
閱讀 3516·2019-08-29 12:51
閱讀 3310·2019-08-29 12:30
閱讀 752·2019-08-26 13:24
閱讀 3689·2019-08-26 10:38