Javascript 闭包

闭包(Closure)的官方解释晦涩难懂,他是这么说的:

「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

不拿代码举例的话,谁知道这说的是个什么玩意儿?直到我看到了如下说明:

闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」。

这样说似乎还是不大容易理解,于是 MDN 写了这个例子(demo):

然后我们发现其实改成这样也是可以的(demo):

这个时候 func 是一个闭包,由返回的匿名函数函数和闭包创建时存在的 “Mozilla” 字符串形成。然后我们再来加点料(demo):

上述例子中会依次弹出「mozilla makes firefox」、「google makes chrome」、「apple makes safari」,new 了一个 class 的既视感有木有?

使用闭包还可以模拟私有属性和方法(demo):

这样做了以后就只有使用 setter 和 getter 才可以访问自己模拟的私有方法或属性了。

在循环中创建闭包时容易发生多个闭包共用最后一次循环时产生的数据这样的错误,MDN 给出的方案是使用更多的闭包(错误正确):

更复杂的例子

不过说了很多,其实最后发现「闭包」着实是一个比较蛋疼的技术,如果你只是常规的页面交互使用概率还是比较小的,关于此,MDN 如是说

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。
例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用,方法都会被重新赋值一次(也就是说,为每一个对象的创建)。

参考资料:
Secrets of JavaScript Closures
闭包 – MDN

Mavericks 中使用 SourceTree

之前说了 Windows 上 Git 的使用以及 SourceTree 的使用,现在说一下 MAC,以当前最新的 Mavericks 为例吧:

1. 似乎全新安装的 Mavericks 系统里面并不自带 git,所以需要自己下载,当我们在终端中输入“git”后,会提示需要安装 xcode,免费的,点确定后上 app store 下载即可(不过 xcode 的体积有够大的,再配上app store的龟速,妥妥的坑爹);
2. xcode 装好了以后在终端里面就可以使用 git 了(果然是够傻瓜的安装);
3. 接着上 SourceTree 官网下载应用:http://www.sourcetreeapp.com/download/,安装什么的就不用多说了吧;
4. 添加了 repository 后,需要在项目目录下执行如下操作,把权限改为自己的:

Have fun!

使用 GAE Git Push 到 Bitbucket

使用 Bitbucket 主要是因为他提供了免费的 Private Git 空间,于是乎私人项目都会丢到这个上面。不幸的是,本着与先进生产力作对的一贯精神,Bitbucket 被 List 了。

可是 Private Respo 不得不用,于是使用了 GAE(敏感词就不多说了)科学上网,Git 中将服务器地址设置为 http://127.0.0.1 而不是 127.0.0.1(多了个http://),URL 替换 git@ 形式的地址为 https 形式的地址后,就可以用 GAE 进行 Git Push 到 Bitbucket 上面了。唯一的不爽是不能通过使用 Key 来免密码了,每次 Push 都要输入帐号密码,但是总比 Push 不上去,强多了。

本来故事应该到此为止,不过后来又遇到了诡异的事情,当 Push 一些大文件的时候,出现了 Git: error: RPC failed; 的错误,Google 了一圈,得出的结论是,你要改成 git@ 形式的地址,这不是坑爹么,用了这地址咋科学上网呢?最后还是 stackoverflow 大神网站比较牛,找到了答案,只需要在命令行或者 Bash 中执行以下命令即可:

原来是 git buffer 给的内存不足造成的,加大就可以了。

WP 主题中添加 AJAX 响应

为 WordPress Theme 添加可在匿名(未登录)情况下访问的 AJAX 响应,网上资料很凌乱,遂自行记录过程如下。

1. 首先确保主题中有 jQuery 库(似乎这已是各小型网站的标配),没有的话可以在主题 header.php 文件中添加:

2. 然后需要在页面中插入当前网站的 URL 信息,这个信息可以通过如下代码:

如此一来系统将自动在页面中返回 admin-ajax.php 的网络路径了:

于是在将来自己写的 JS 代码中,只需要调用 MyAjax.uri 就能获取到 admin-ajax.php 文件的地址了;

3. 在 function.php 中添加准备用来响应 ajax 请求的 function:

4. 然后开始添加 JS 代码,发送 AJAX 请求,这个放在主题的相应 js 文件里面就行了:

code on Gist

部署完毕,更多内容请参见官方文档

使用 jQuery 1.9 后,如何判断浏览器版本

忽如一夜春风来,我还在用 jQuery 1.8.1 的时候,无意中发现 jQuery 1.9.0 正式版已出。

于是乎惯例性的对 ShadowBlue本主题内置的脚本进行了升级。我这一换不要紧,差点成残疾,原来 1.9.0 中把 $.browser 取消了,全面改成了 $.support,也许 jQuery 的开发者认为通过特征来区分浏览器比通过浏览器版本来区分更加地有效,不过很多时候我们依然需要知道浏览器到底是啥版本。以前,通过 $.browser 我可以很容易地知道现在跑在什么浏览器上,并写成了一个方便的方法:

于是当我调用这个方法就可以知道目前到底是 IE 几(如果不是 IE 则为 100),现在不行了,于是只有使用非 jQuery 内置方法来判断:

点击查看 DEMO | 源码

亲测 IE6-9 都可以正确识别,IE10 识别为非 IE 了,不过这样也无伤大雅。