Debounce 和 Throttle 的原理及实现

在处理诸如 resizescrollmousemovekeydown/keyup/keypress 等事件的时候,通常我们不希望这些事件太过频繁地触发,尤其是监听程序中涉及到大量的计算或者有非常耗费资源的操作。

有多频繁呢?以 mousemove 为例,根据 DOM Level 3 的规定,「如果鼠标连续移动,那么浏览器就应该触发多个连续的 mousemove 事件」,这意味着浏览器会在其内部计时器允许的情况下,根据用户移动鼠标的速度来触发 mousemove 事件。(当然了,如果移动鼠标的速度足够快,比如“刷”一下扫过去,浏览器是不会触发这个事件的)。resizescrollkey* 等事件与此类似。

可以参看这个 Demo 体会下。

Read more

Decorators in ES7

ES6 已经来了,ES7 还会远么?

ES6 标准已于上个月(2015年6月17日)正式发布,众多新特性成为标准固然另人激动,然而更值得憧憬的还是未来。所以,让我们来看看 ES7(更正式的说法是 ES2016)有哪些激动人心的变化。最为人津津乐道的可能就是 async/await 了,不过我个人非常喜欢 Yehuda Katz 提出的 decorator 模式,本文尝试对此做一个介绍。

decorator 是什么

ES7 的 decorator 概念是从 Python 借来的,在 Python 里,decorator 实际上是一个 wrapper,它作用于一个目标函数,对这个目标函数做一些额外的操作,然后返回一个新的函数:

Read more

《论自由》读书笔记

注:我读的是 顾肃译本,对我来说,这个译本总体上读起来很通顺,除了极少数长句有些别扭之外,其他都很容易理解。

密尔的这本《论自由》,其实早就应该读的。大学期间在图书馆看到过一本老旧的严复译《群己权界论》,严本所受评价甚高,奈何其文颇为晦涩拗口(其实是我古文水平太低),翻了两页就没勇气继续下去了,后面就一直束之高阁。直到最近,才趁着空闲时间,读完了这本只有不到两百页的「小书」。

在本书的开篇,作者就声明,本书要讨论的「自由」是「公民自由或社会自由,即社会可以合法地施加于个人的权力之性质和界限」(由此可见严复译本书名之准确贴切)。这个界限是什么呢?作者说,是自我保护,即「人类可以个别地或集体地对任何成员的行动自由进行干涉,其唯一的正当理由是旨在自我保护」。在其他任何情况下,只要一个人的行动不会明显而立即地对他人造成伤害,则社会没有权力阻止他的行动。这说的是社会权力之界限。由此我们也可以推导出个人自由的界限,这个界限就是,个人自由不能妨害他人同样的自由

Read more

Todomvc with ES6 and jspm

jspm 是一个包管理器,使用 SystemJS 这个模块加载器进行模块的管理。SystemJS 是一个所谓 universal module loader,基于 ES6 module loader,除了能加载 ES6 模块,还支持 CommonJS,AMD 及 globals 语法。

1. How jspm load modules

jspm 通过 registry 加载模块,它其实没有自己的仓库,目前只能加载 npmgithub 上的模块,当然也可以自己通过它的 registry 机制「注册」一些模块之后使用。

Read more

HTTP/2 简介

5/15/2015 更新:

HTTP/2 协议标准已经敲定了,是为 RFC7540

1. HTTP 现状

HTTP 是现在互联网上使用最广泛的网络协议,它的当前版本是 HTTP/1.1,也是使用范围最广的版本(实际上还有不少的代理服务器在使用 HTTP/1.0)。HTTP 的标准由 IETFW3C 共同负责制定,HTTP/1.1 的最初版本于 1997 年 7 月发布,即 RFC 2068。随后在 1999 年 6 月,他们又发布了 RFC 2616,主要针对 RFC 2068 进行一些修订和改善。2014 年 7 月,RFC 2616 更新为 RFC 7230 等六个 RFC 标准。

1.1 传输量和请求数

随着前端技术的发展,包括 JavaScript 层出不穷的框架和类库,以及越来越成熟的构建工具和模块化开发等等,导致网页上需要展现的内容及加载一个页面所需的请求数越来越多,而这一趋势,短期来看,并无扭转的可能。

下图展示了从 2011 年 4 月到 2015 年 4 月网页的平均传输量和请求数,可以看到,现在用户打开一个网页需要下载的资源已经达到将近 2MB,请求数也接近 100。(数据来源:httparchive.org

Read more