無標題文檔

匿名函数的写法

这是 小马 在交流会中的分享,可能有些朋友还不曾了解,同时也为了自己温故而知新,就整理下。

多种方式

可以想像得到,有很多方法立即执行匿名函数,简单的整理就有下面三种的典型方式(还有其他方式的,欢迎告知):

方式一

(function() {
    // …
})();

方式二

void function() {
  // …
}();

方式三

~function() {
   // …
}();

方式一 和 方式二 大家可能都看到过,这里主要说明下 方式三。在说明 方式三 之前,我们现回顾下运算符「~」(位取反)在 EMCAScript 中的定义(第五版的第 72 页),简单的翻译下:

  1. 按运算符结合语句
  2. 将旧值转换为 32 位整型
  3. 执行运算符后的语句
  4. 转换之行结果为 32 位整形并返回

从上面可以了解,其实位运算符都能立即返回后面表达式的值。其实其他位运算符都可以达到这样的目的,例如

!function() {
    // …
}();

等都可以达到我们的目的。所以其实用「~」也并无其他的原因,仅仅是代码「看着好看」而已 :^)

效率

与其说三种方式执行匿名函数的效率,到不如直接分析个运算符的执行效率。那么我们对比再来看看「()」以及「void」在 EMCA 规范中的定义

组运算符(第五版 66 页)

  1. 返回表达式的执行结果

void(第五版 70 页)

  1. 按运算符结合语句
  2. 执行
  3. 返回 undefined

由于组运算符还需要执行语句并返回语句块返回的值,对比 void 会多个获取语句块的操作(虽然消耗不了多少的性能),因此在这种情况下 void 的性能要优于组运算符。

对比两者,那么 方式三 的性能对比很明显要低于前两者。总结起来就是光从语法的角度上分析,在上面三者匿名函数的方式中 方式二 优于 方式一,方式三 的效率最低。

总结

思考下三者之间的优异

  • 方式一的写法很常见而且很保险,所以并不会有人因为你使用这种方式而责怪你
  • 但使用方式一的同学,可能经常会犯忘记匹配括号的「毛病」(特别是语句块很长时,就经常搞错)
  • 使用位运算符执行匿名函数很新潮,用来装酷不错
  • 很多 IDE (如 IDEA )以及语法高亮工具不支持 方式三 的写法
  • void 效率最好,但总感觉相比其他两种实现方式非常的臃肿(仅仅多几个字符?)

那么

  • 综合代码量以及效率等情况考虑,用 方式一 没错的
  • 在需要额外节省代码的极端情况,用 方式三
  • 考虑效率优先,那么使用 方式二

这里要说明下,其实三种方式效率之间的差异非常小。因此单纯拿效率来考虑采用那种方式,几乎是站不住脚的。

具体采用何种方案,需要根据实际情况来考虑。比如我自己,经常会使用方式三,是因为 1、方便(加一个字符即可) 2、在函数长的情况下匹配括号会很头晕 3、用起来很酷,但 方式三 会经常让看我代码的组员感到困扰。

如果在些类库等框架性质的基础代码,用 方式一 最保险同时大家都容易看懂,是最保险的选择。

看见 阮一峰 的 Blog 上有篇文章说避免使用 void 运算符 。其实在 Javascript 中, void 的使用方面还是比较常见的。

例如,我们会强制让某些调用返回 undefined 以阻止浏览器等默认行为(我们经常看到的就比如很多 Javascript Bookmark 前面就经常会加上 void 运算符)。

所以,还是「物尽其用」吧。

-- EOF --

改进 Fun Input Toy

Fun Input Toy(简称 FIT) 是我在 Mac 下一直在用的输入法。相比收费的 QIM ,FIT 给我最大得不爽主要有两点 1、词库相对 QIM 要小 2、图标太难看,于是就开始动手改造。

词库

搜索了下, 其实 FIT 已经发布了大词库版 。但本人较懒不想重新安装 FIT,于是将安装包里面的词库抽出来,直接覆盖掉原来的。

如果你觉得麻烦, 你可以下载我打包好的文件 ,解压缩后直接将里面得文件覆盖至

/Library/Input Methods/Fun Input Toy.app/Contents/Resources/ 

目录下即可。

最主要得这里还要说下个人词库,FIT 的个人词库在

~/Library/FunInputToy/

目录下,不出意外的话,会有 bh.sqlite、py.sqlite 、wbx.sqlite 三个文件,分别对应 FIT 提供的三中输入法,看文件名就顾名思义格式为 SQLite 文本数据库。

搞清楚表结构以后,写了个 PHP 脚本将我在 Win 下使用的 谷歌输入法的个人词库就导入了过来。如果你对这个脚本感兴趣, 到这里查看

图标

呃,这个其实是个人喜好问题,FIT 的图标感觉不是和 Max OS 菜单栏的「传统图标风格」很相配,于是我简单用 Photoshop 画了一个,效果如下(如果还是觉得不好看,压缩包里有 PSD 文件):

https://friable.rocks/_/2009_12_30/1262171549.png

替换的方法和上面替换词库类似,所以觉得麻烦就直接将压缩包里的文件全部替换掉吧。建议为了保险起见记得备份,本人可不承担任何责任 :^)

最后,全部搞定后重新注销登录下你的系统,FIT 看起来就舒服多了。

-- EOF --

第四届 D2 的些记录

第四届 D2 圆满的结束,不过对此的思考却并未停止。

嘉宾们的分享&感想

模板语言与大前端

随着前端技术发展日趋复杂,「传统」后端的建模等计数也逐渐尝试应用到前端脚本逻辑中。将我们熟悉的 MVC 应用到 Javascript (以及对应的 DOM 编程中),这两个「老朋友」的结合仍然能够给我们带来不同的思考。

可以预见的是在不远的将来,复杂的前端应用中随处都能看见模板引擎的应用。遗憾的是由于时间的关系,没有留给 大为 更多的时间讨论。环绕在脑中的思考,或许要等瞄下他的 lite template 后才会有个大致的消化和理解。

从 YUI2 到 YUI3 的前端演变

说实话一直没有深入研究过 YUI3,一来是因为时间、二来期前个人认为它目前不是很成熟。此前 玉伯 经常「推销」YUI2 至 YUI3 的「革命性转变」。今天,他的观点也从 克军 的分享上得到了印证。

克军 的分享现在回过头来对比看,是此次 D2 我收获最多的。通过他的分享,对于 YUI3 的印象也逐渐的清晰和「得到平反」。现在,急需要做的就是花点时间去真正了解这个框架(当然,我指的是不仅仅是它的源代码)。

Sliverlight QQ 项目实践

相比 甄炎鯤 (呃,还是叫他 Shadow 吧) 的分享内容,其实对我印象最深的还是在线下私聊的内容。

-- 这段内容就被「和谐」了吧 :^) --

前端性能优化和自动化

秦歌 的分享其实早先在内部已经听过,对他们在前端代码自动化方面的尝试让我赞叹不已。的确,代码自动压缩、Combo 其实是件非常机械和无聊的事情,完全可以交付机器去处理。

也如 玉伯 所言 ,将性能优化以及自动化两个那么「大」的话题放在一起,觉得有些泛同时也略显单薄。其实,我更期待 秦歌 能够再单独深入讲讲他们在自动化的方面的尝试。唉,众口难调呀 :^)

个人秀

个人秀环节 hax 与 army 的「PK」,让我再次见识到了技术人员对于各自专业领域的执着。同时,会后与 hax 交流分享各自的心得和经验,不禁感叹下 hax 在前端方面的深度和广度,我得努力。

前端&安全

回到我自己的分享,说实话其实这个话题并不好讲( 幻灯片下载 )。

一来,是因为会场要么就是已经了解我今天所要讲的话题内容的「技术人员」、要么就是就算我讲了散会了都没听懂的「设计人员」;二来,是因为某些方面的原因,安全这块原理以及案例也需要「点到即止」,深浅程度实在是过难于把握。

还有我个人,只不过是相比其他不了解前端安全的朋友多走了一小步而已。玉伯说前端安全「我们目前处于 65 分」,其实在我看来我们还仅仅是 59 分 -- 还需要继续努力。

似乎又回原先和朋友们争论的几个话题,「前端到底要不要触及安全领域,甚至前端要不要专门研究前端脚本攻击技术」。在我看来,这一切说实话还是个未知数,毕竟「前端开发工程师」这个职位还是刚刚被业界承认,而「前端安全工程师」这个职位自然还要有更多的路要摸索。

但有点可以确定,就是同比之下如果前端了解安全方面的常识,这将会给自己带来更强的竞争力。借用此届 D2 的口号,就是「让我们蜕变,成为安全力量的新生力量;让我们成长,成为整个研发团队乃至整个公司不可或缺的一部分」。

言论

记录下嘉宾们对我印象最深的一句话:

  • 大为:「工具是人使用它,平台是它摆布人」
  • 克军:「好的设计驱动技术创新(Design) + 好的技术为设计提供无限的想象(Development)= D2」
  • 焱鲲:「Silverlight 和 Flash 可以通过 Javascript 粘合起来,也许能创造更好的效果,没有做不到,只有想不到」
  • 学鹍:「前端工程师必须学会用互联网去学习」

杂念

  • 此届 D2 时间方面给人感觉有些紧张,其实一天听五个分享,基本上能完全消化两到三个(甚至一到两个)已经算很不错的事情
  • 普遍反应会场有些寒冷同时接线板有些紧张,这点有些对不住远道而来的同行
  • 此届 D2 来的同行,比我想象中的多
  • 会场中的微博客投影有时候比场上嘉宾的分享还精彩
  • 其实国内前端这个圈子很小
  • 主持人 闭月 今天的表现真不错
  • 中奖的观众似乎都冲着书去了,囧
  • 文亮 的外语不错,以后去东瀛买片儿找他
  • 终于了解了「专注」和「关注」这两个词语的不同含义
  • 还有就是,我终于当着五百人的面,学会了 Mac 下如何放大屏幕 :^D

计划

  • 熟悉下 大为 的模板引擎
  • 认认真真学习 YUI3

OK,从现在开始,期待下届 D2 吧

-- EOF --

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章