Underscore 源码
Underscore 源码
作者:韩子迟
What?
不知不觉间,「Underscore 源码解读系列」进入了真正的尾声,也请允许我最后一次 po 下项目的原始地址 https://github.com/hanzichi/underscore-analysis
这半年以来,花费了大量的业余时间,共计写了 25 篇随笔(包括此文),也给 underscore-1.8.3 的源码加了差不多 1500 行 注释,对于当初说的要做「史上最详细的 underscore 源码剖析」,至此我也觉得问心无愧。
本文不想说我在这个过程中学到了什么,学到的东西,能写的都在前面 24 篇随笔中了,只能意会的我也说不出来(感触最深的是闭包的强大)。本文是一篇「水文」,不谈技术,抛开代码,听楼主扯扯淡。
Why Underscore?
早期的几篇随笔都有「Why Underscore」这一节:
阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多。为什么是 Underscore?最主要的原因是 Underscore 简短精悍(约 1.5k 行),封装了 100 多个有用的方法,耦合度低,非常适合逐个方法阅读,适合楼主这样的 JavaScript 初学者。从中,你不仅可以学到用 void 0 代替 undefined 避免 undefined 被重写等一些小技巧 ,也可以学到变量类型判断、函数节流&函数去抖等常用的方法,还可以学到很多浏览器兼容的 hack,更可以学到作者的整体设计思路以及 API 设计的原理。
其实这并不是直接原因,「导火索」是当时(三月末)学习函数节流和函数去抖的时候,发现很多文章混淆了这两个概念,了解到 Underscore 封装了这两个函数,但是一用却发现了它的 BUG!(详见 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考 一文)
Underscore 早些年就接触过,对其的了解也仅限于「一个轻巧的工具库」,会不会还有其他的 BUG?同时源码这么短(之前想过看 jQuery,被接近 1w 行吓回来了),耦合度低(可以一个个方法分开看),也进一步激发了通篇解读的兴趣,想着这一路下来肯定能学到不少东西。好东西要与大家分享,同时确定了写系列文章的 idea。
Where to write?
哪里写?想都没想就确定了主战场 GitHub。之前我是不玩 GitHub 的,现在已经离不开了,每天不刷个几十次都手痒。为什么确定在 GitHub?理由很简单,GitHub 有逼格啊(毕竟是全球最大的同性交友社区)。
当然,酒香也怕巷子深,写完了没人看无疑是对自信心的极大打击,同时也需要大家来提出宝贵的意见。为此,几乎每一篇完成后,都会在以下渠道分享:
其实主要就是前三个,后面两个用了一段时间感觉不大好就不用了。极客头条个人感觉分类有点乱,同时因为是 CSDN 旗下的,个人对 CSDN 没太多好感;干货集中营的话,维护者是「daimajia」大大,感觉移动开发者关注的会比较多。
分享的话,如果脸皮厚的话,也可以在微博艾特一些圈内大大们(楼主脸皮比较薄 ...)。
当然,我不仅在 GitHub 的 issue 里写,还在以下一些渠道写:
简书的话,后面断断续续不更了,个人喜欢专门的 IT 类博客,而且觉得简书的 Markdown 渲染有问题,为什么都说它的 Markdown 体验好 ... sf 和 伯乐在线 的话,阅读量还是可以的,只是它们不是专门做博客系统的,基础的分类归档功能都没有(或许是我没找到?),以后应该还是会以博客园为主要战场。
Then?
underscore.js 的源码解读画上了句号,接下去干嘛?其实楼主对以下几个库也挺感兴趣的。
- lodash(Underscore 的完美替代品,据说效率比 Underscore 高好多)
- underscore.string(Underscore.js 没有为 String 扩展方法)
- underscore-contrib(Underscore-contrib 是一个 Underscore 的代码贡献库)
- Underscore.php / API
- underscore.php(Underscore.js 官网 推荐)
End
那就这样吧,749 Star / 140 Watch / 153 Fork 算是对我的肯定和鼓励吧 ^_^
也许我韩子迟还会回来的!
程序员都应该学点算法:https://github.com/hanzichi/leetcode
了解博主韩子迟:http://www.cnblogs.com/zichi/p/about.html
GitHub:https://github.com/hanzichi Follow 楼主给楼主更多写作的动力~
Underscore 源码的更多相关文章
- underscore 源码解读之 bind 方法的实现
自从进入七月以来,我的 underscore 源码解读系列 更新缓慢,再这样下去,今年更完的目标似乎要落空,赶紧写一篇压压惊. 前文 跟大家简单介绍了下 ES5 中的 bind 方法以及使用场景(没读 ...
- 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考
事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事本身并没有什么可说的,但是过程值得我们深思,记录如下,各位看官仁者见仁智者见智. 平时有浏览园区首页文章的习惯 ...
- underscore源码阅读记录
这几天有大神推荐读underscore源码,趁着项目测试的空白时间,看了一下. 整个underscore包括了常用的工具函数,下面以1.3.3源码为例分析一下. _.size = function(o ...
- underscore源码解析(一)
留存root // Establish the root object, `window` (`self`) in the browser, `global` // on the server, or ...
- Underscore源码阅读极简版入门
看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...
- 前端日报-20160527 underscore 源码解读
underscore 源码解读 API文档浏览器 JavaScript 中加号操作符细节 抛弃 jQuery,拥抱原生 JS 从 0 开始学习 GitHub 系列之「加入 GitHub」 js实现克隆 ...
- #啃underscore源码 一、root对象初始化部分
最近由于比赛要交了,以及工作室屯了各种项目,实在忙不过来刷题,所以很久没更blog了(良心痛),现在自己的水平还是渣代码堆砌 + 简单的增删改查(悲伤) 所以痛定思痛,决定之后的任务是先补学校课堂的知 ...
- underscore源码解析 (转载)
转载出自http://www.cnblogs.com/human/p/3273616.html (function() { // 创建一个全局对象, 在浏览器中表示为window对象, 在Node.j ...
- underscore源码解析
(function() { // 创建一个全局对象, 在浏览器中表示为window对象, 在Node.js中表示global对象 var root = this; // 保存"_" ...
随机推荐
- 分页控件(PageControl)的相关属性说明
UIPageControl *pageControl = [[UIPageControl alloc] init]; pageControl.center = CGPointMake(w * ); p ...
- Convolution and Deconvolution
1.Introduction 2.Convolution 3.Deconvolution 4.Summary
- 支持多浏览器的镜像反转css效果
今天接到一个需求,通过一张图片得到其镜像对称的图片.本来说是后台处理的,但这样除了技术上难实现之外,还带来了资源消耗的问题,相当于每张图都要存储一个副本了. 只记得以前用过css的滤镜可以实现这个,但 ...
- javascript事件代理(委托)
之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>0 ...
- .NET P****** CMS 逆向工程
(应一些园友建议,我把敏感字段去掉) 其实当初我的目的是很纯洁的,只是想找一个简单的网站生成模板,由于对.net更熟悉一点,就去搜索了.net框架的CMS,看它的介绍挺强大的,符合最初的目的,但是下下 ...
- 运用DataTable进行行转列操作
public DataTable GetReverseTable(DataTable p_Table) { DataTable _Table = new DataTable(); ; i != p_T ...
- AccessHelper类
using System; using System.Data; using System.Configuration; using System.Data.OleDb; using System.C ...
- pip在windows域下使用代理安装package方法
首先说明下,本人在公司使用windows域账户代理上网,用pip在线安装package 返回ProxyError,类似Tunnel connection failed: 407 authenticat ...
- 实例:使用纹理对象创建Sprite对象
精灵类是Sprite,它的类图如下图所示: Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的派生类有:PhysicsSprite和Skin.Physics ...
- CSS布局 ——从display,position, float属性谈起(转)
CSS布局 ——从display,position, float属性谈起 页面布局,或者是在页面上做些小效果的时候经常会用到 display,position和float 属性,如果对它们不是很了 ...