一次發現underscore源碼bug的經歷以及對學術界拿來主義的思考

事情是如何發生的

最近幹了件事情,發現了 underscore 源碼的一個 bug。這件事自己並無什麼可說的,可是過程值得咱們深思,記錄以下,各位看官仁者見仁智者見智。javascript

平時有瀏覽別人文章的習慣,看到一篇關於 "函數節流" 的文章(具體是哪篇就不說了),不過很遺憾做者彷佛並無搞清楚 throttle 和 debounce 的區別(或許根本不知道 debounce)。因而隨手 Google 了一下,發現大多數談 "函數節流" 的文章都會引用《高程三》中的經典代碼:css

代碼自己並無問題,可是很惋惜,函數名有問題,應該叫 debounce 而非 throttle,這就引起了個人思考,這個錯誤的概念,這段錯誤的代碼,爲何可以 "流芳百世"?html

throttle vs debounce

因爲篇幅以及主題的關係,本文並不會講 throttle 和 debounce 的具體用法以及區別等。(對此有興趣的朋友能夠跟帖,人數多的話樓主會另開一文)java

有些人可能會說,憑什麼你覺得的 throttle 就是 throttle,debounce 就是 debounce?這就要聊聊我對於 "理解某一個概念" 的方法。jquery

就以 throttle 爲例,某日,老師給你佈置了一個做業,讓你深刻理解一下 throttle,次日上課來聊聊。張三內心很是高興,這個概念在經典書籍《JavaScript高級程序設計》中見過,打開一看,就兩頁,並且解釋地很是清晰,看完就高興地幹別的事情去了。而李四,以爲高程三講的有點少,而去谷歌了下其餘關於 throttle 的知識點,興奮地看到 throttle 函數的好幾種寫法,發現高程三隻是用了最簡單的方式,還有更優雅運用場景更多的寫法,或許此時他已經發現和 throttle 同時出現的還有個 debounce,這是什麼鬼?反正老師沒說,之後再看吧,因而心滿意足地玩遊戲去了。而王五,和李四同樣發現了 debounce,這是什麼?一塊兒瞭解了吧,繼而發現 debounce 的用法竟然和高程三中的 throttle 同樣!繼續挖下去,發現高程三中的 throttle 函數其實應該叫 debounce,看到最後,王五已經把 throttle 和 debounce 完全理解了。git

咱們要作王五。github

首先,咱們並不能只聽一家之言。這裏的一家是指 "我的",對於一些官方的文檔咱們仍是應該充分信任的。澤卡斯也是人,犯點小錯在所不免。segmentfault

其次,咱們對信息要作充分刪選。網上的信息大多魚龍混雜,出錯了也並不會對你負任何責任。那麼如何可以辨別出正確有用的信息呢?首先固然是看官方文檔,好比說要了解 HTTP 那麼就去看官方的 RFC,要學習 jQuery 的話能夠去官網 https://jquery.org/ 查查資料,這些通常都不會有什麼問題。若是以爲官網資料晦澀難懂,能夠試着去看看 Wikipedia 或者XX百科,維基的精確度被不少人噴過,樓主以爲仍是值得一看的,若是看英文比較吃力的,就看看國內的一些百科。第三,就是瀏覽一些前人的文章了,這也是最廣泛可是也最容易混淆概念的地方,因此咱們要儘可能挑一些權威的專家級做者(好比樓主,開玩笑啦^_^)。第四,若是仍是以爲無法理解,能夠試着去一些問答社區,首推 stackoverflow,國內的話能夠看看 segmentfault,知乎,看贊同多的回答,通常來講問題不大。函數

樓主找到的關於 throttle 和 debounce 區別的資料以下:post

關於拿來主義

爲何這麼多文章裏會出現澤卡斯的錯誤代碼?樓主想到了一個詞,叫作 "拿來主義"。

不少人寫博客,只是爲了寫博客而寫博客,隨便谷歌百度下,找到搜索頁前幾個連接,東拼西湊下,一篇新鮮的博文就誕生了,甚至都沒有本身寫 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 或者直接點擊頁面右上角,謝謝關注!

相關文章
相關標籤/搜索