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