摘要:最近開始看源碼,并將源碼解讀放在了我的計劃中。相對于其他源碼解讀的文章,基本都會從整體設(shè)計開始講起,樓主覺得這個庫有點特殊,決定按照自己的思路,從用代替說起。源碼沒有出現(xiàn)注意,其實有出現(xiàn)一處,是為,而不是,而用代替之。
Why underscore
最近開始看 underscore源碼,并將 underscore源碼解讀 放在了我的 2016計劃 中。
閱讀一些著名框架類庫的源碼,就好像和一個個大師對話,你會學(xué)到很多。為什么是 underscore?最主要的原因是 underscore 簡短精悍(約 1.5k 行),封裝了 100 多個有用的方法,耦合度低,非常適合逐個方法閱讀,適合樓主這樣的 JavaScript 初學(xué)者。從中,你不僅可以學(xué)到用 void 0 代替 undefined 避免 undefined 被重寫等一些小技巧 ,也可以學(xué)到變量類型判斷、函數(shù)節(jié)流&函數(shù)去抖等常用的方法,還可以學(xué)到很多瀏覽器兼容的 hack,更可以學(xué)到作者的整體設(shè)計思路以及 API 設(shè)計的原理(向后兼容)。
之后樓主會寫一系列的文章跟大家分享在源碼閱讀中學(xué)習(xí)到的知識。
underscore-1.8.3 源碼全文注釋 https://github.com/hanzichi/underscore-analysis/blob/master/underscore-1.8.3-analysis.js
underscore-1.8.3 源碼解讀項目地址 https://github.com/hanzichi/underscore-analysis
歡迎圍觀~ (如果有興趣,歡迎 star & watch~)您的關(guān)注是樓主繼續(xù)寫作的動力
Why does void 0 replace undefined說來慚愧,underscore 源碼解讀這個 Repo 放在 Github 都已經(jīng) 20 天沒有更新了,要不是今天 "不小心" 注意到,我居然都快忘了(是不是 lu 多了),所以今晚無論如何都要 lu 出第一篇(畢竟萬事開頭難)。相對于其他源碼解讀的文章,基本都會從整體設(shè)計開始講起,樓主覺得 underscore 這個庫有點特殊,so 決定按照自己的思路,從用 void 0 代替 undefined 說起。
underscore 源碼沒有出現(xiàn) undefined(注意,其實有出現(xiàn)一處,是為 "undefined",而不是 undefined),而用 void 0 代替之。為什么要這么做?我們可以從兩部分解讀,其一是 undefined 哪里不好了,你非得找個替代品?其二就是替代品為毛要找 void 0?
我們先看第一點,答案很簡單,undefined 并不是保留詞(reserved word),它只是全局對象的一個屬性,在低版本 IE 中能被重寫。
var undefined = 10; // undefined -- chrome // 10 -- IE 8 alert(undefined);
事實上,undefined 在 ES5 中已經(jīng)是全局對象的一個只讀(read-only)屬性了,它不能被重寫。但是在局部作用域中,還是可以被重寫的。
(function() { var undefined = 10; // 10 -- chrome alert(undefined); })(); (function() { undefined = 10; // undefined -- chrome alert(undefined); })();
接下來思考第二個問題,為毛找的替代品是 void 0?
我們來看看 MDN 的解釋:
The void operator evaluates the given expression and then returns undefined.
意思是說 void 運算符能對給定的表達(dá)式進(jìn)行求值,然后返回 undefined。也就是說,void 后面你隨便跟上一個表達(dá)式,返回的都是 undefined,都能完美代替 undefined!那么,這其中最短的是什么呢?毫無疑問就是 void 0 了。其實用 void 1,void (1+1),void (0) 或者 void "hello",void (new Date()) 等等,都是一樣的效果。更重要的前提是,void 是不能被重寫的(cannot be overidden)。
那么,ES5 大環(huán)境下,void 0 就沒有用武之地了嗎?答案是否定的,用 void 0 代替 undefined 能節(jié)省不少字節(jié)的大小,事實上,不少 JavaScript 壓縮工具在壓縮過程中,正是將 undefined 用 void 0 代替掉了。
一篇不長的文章寫了兩個小時,心累,不點個贊、不關(guān)注下樓主的 Repo 你覺得好意思嗎?https://github.com/hanzichi/underscore-analysis
Read Morevoid MDN
What does void 0 mean?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/79472.html
摘要:你們說能不能就用的開發(fā)模式來實現(xiàn)客戶端啊這樣版版版就都有了。有道云筆記可能就是最貼近我們想法的產(chǎn)品,有客戶端,有版。這個項目由發(fā)起和維護(hù)。 最近一個多月一直在用 AngularJS 做公司的一個項目(還沒有做完),我之前主要是用 PHP 開發(fā)服務(wù)端的,AngularJS 也是現(xiàn)學(xué)現(xiàn)賣,整個過程還是比較有意義的,覺得很有必要寫篇文章記錄一下。 緣起 事情是這樣的……我們團(tuán)隊的產(chǎn)品是一款 ...
摘要:你們說能不能就用的開發(fā)模式來實現(xiàn)客戶端啊這樣版版版就都有了。有道云筆記可能就是最貼近我們想法的產(chǎn)品,有客戶端,有版。這個項目由發(fā)起和維護(hù)。 最近一個多月一直在用 AngularJS 做公司的一個項目(還沒有做完),我之前主要是用 PHP 開發(fā)服務(wù)端的,AngularJS 也是現(xiàn)學(xué)現(xiàn)賣,整個過程還是比較有意義的,覺得很有必要寫篇文章記錄一下。 緣起 事情是這樣的……我們團(tuán)隊的產(chǎn)品是一款 ...
摘要:在閱讀一些框架源碼時,發(fā)現(xiàn)都是用的代替,簡單的了一下運算符運算符對給定的表達(dá)式進(jìn)行求值,然后返回。在之前,給賦值會覆蓋該屬性。但是由于不是保留字,依然可以在局部作用域中聲明一個的變量,并改變它的值。 在閱讀一些框架源碼時,發(fā)現(xiàn)都是用的 void 0 代替 undefined,簡單的 Google 了一下: void 運算符 void 運算符 對給定的表達(dá)式進(jìn)行求值,然后返回 undef...
摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實有待考證結(jié)尾第一篇暫時寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實主要有兩點 下劃線源碼中通篇可見這樣的判斷...
閱讀 4027·2021-11-24 09:38
閱讀 3354·2021-11-15 11:37
閱讀 912·2021-11-12 10:36
閱讀 3641·2021-10-21 09:38
閱讀 3374·2021-09-28 09:36
閱讀 2521·2021-09-22 16:01
閱讀 5276·2021-09-22 15:09
閱讀 1357·2019-08-30 15:55