December 2011
1 post
2 tags
说说为什么 [] == ![] 为true
此前在微博上无意中看到有人问“为什么alert([] == ![])会是true?”, 刚看到这个问题我也说不上来究竟是什么原因,只知道这个肯定又是和==操作相关的类型转换问题。 于是,就翻开了“葵花宝典(ECMA-262-5th)”,你懂的。 在宝典的帮助下,我尝试着来解释下该问题的原因: 首先看看==这个操作内部是如何工作的 宝典中的关于==操作的工作描述如下(11.9.1): The production EqualityExpression: EqualityExpression == RelationalExpression is evaluated as follows: 1. Let lref be the result of evaluating EqualityExpression 2. Let lval be...
Dec 9th
9 notes
November 2011
1 post
1 tag
Rise of Node - Part I →
Node入门介绍,内容涵盖Node的家族史,以及核心的单线程非阻塞概念,最后有大量的学习资源给初学Node的童鞋
Nov 10th
October 2011
7 posts
使用node-inspector来调试node
大部分程序员(比如我),开发的过程中,其实只有20%的时间在写代码,另外80%的时间都在调试代码。完全符合著名的80/20法则。 好吧,我承认我在滥用伟大的法则,废话很多。其实,我就想说明我们大部分时间都在调试(Debug)而不是在写代码。 所以,要想尽一切办法提高调试的效率,这样有助于提高开发效率。 对于node的调试,官方wiki中有在eclipse中调试node的文章。 但是,不知为何,我在eclipse中总是不成功(eclipse 3.7 + ubuntu 11.04),况且,要是不用eclipse那咋办呢? 于是,我就另谋出路,在github上一番寻觅之后,发现了:node-inspector。 用了一把之后,感觉神清气爽,遂推荐给大家。 那么如何使用呢?其实官方有很详细的教程,不过这里我还是要赘述下,并且以joyent官方的例子来作为调试代码: //...
Oct 16th
1 note
2 tags
JavaScript内部原理实践——真的懂JavaScript吗?
通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解。 但是,邓爷爷说过:“实践才是检验真理的唯一标准”。 所以,我打算通过从内部原理来解释一些经常在笔试或者面试中遇到的关于JavaScript语言层面的题目来进一步学习和掌握JavaScript内部工作原理。 那么,首先就是要去找那些题目,google了一圈终于找到了来自Dmitry Baranovskiy的非常著名的5个问题, 这5个问题,NCZ给出了非常清楚的解释。 不过,我还是想尝试下从low-level——JavaScript内部工作机制的角度去解释下这些问题。 好吧,我承认我废话很多,那就开始吧。 问题 #1 if (!("a" in window)) { ...
Oct 15th
闭包(Closures)
说明 此文译自Dmitry A.Soshnikov 的文章closures 另,此文还有另外一位同事(彭森材)共同参译 概要 本文将介绍一个在JavaScript经常会拿来讨论的话题 —— 闭包(closure)。闭包其实已经是个老生常谈的话题了; 有大量文章都介绍过闭包的内容(其中不失一些很好的文章,比如,扩展阅读中Richard Cornford的文章就非常好), 尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的。 正如在此前文章中提到的,这些文章都是系列文章,相互之间都是有关联的。因此,为了更好的理解本文要介绍的内容, 建议先去阅读下第四章 - 作用域链和 第二章 - 变量对象。 概论 在讨论ECMAScript闭包之前,先来介绍下函数式编程(与ECMA-262-3...
Oct 11th
2 tags
函数(Functions)
说明 此文译自Dmitry A.Soshnikov 的文章Functions 概要 本文将给大家介绍ECMAScript中的一般对象之一——函数。我们将着重介绍不同类型的函数以及不同类型的函数是如何影响上下文的变量对象以及函数的作用域链的。 我们还会解释经常会问到的问题,诸如:“不同方式创建出来的函数会不一样吗?(如果会,那么到底有什么不一样呢?)”: var foo = function () { ... }; 上述方式创建的函数和如下方式创建的有什么不同? function foo() { ... } 如下代码中,为啥一个函数要用括号包起来呢? (function () { ... })(); 由于本文和此前几篇文章都是有关联的,因此,要想完全搞懂这部分内容,建议先去阅读第二章-变量对象 以及第四章-作用域链。 ...
Oct 10th
作用域链(Scope Chain)
说明 此文译自Dmitry A.Soshnikov 的文章Scope Chain 另,此文还有另外一位同事(邵信衡)共同参译 概要 在第二章变量对象的时候, 已经介绍过执行上下文的数据是以变量对象的属性的形式进行存储的。 还介绍了,每次进入执行上下文的时候,就会创建变量对象,并且赋予其属性初始值,随后在执行代码阶段会对属性值进行更新。 本文要与执行上下文密切相关的另外一个重要的概念——作用域链(Scope Chain)。 定义 若要简单扼要对作用域脸做个解释,那就是:作用域链和内部函数息息相关。 众所周知,ECMAScript允许创建内部函数,甚至可以将这些内部函数作为父函数的返回值。 var x = 10; function foo() { var y = 20; function bar() { alert(x + y); ...
Oct 10th
2 tags
this
说明 此文译自Dmitry A.Soshnikov 的文章this 概要 本文将进一步讨论与执行上下文密切相关的概念——this关键字。 事实证明,this这块的内容非常的复杂,它在不同执行上下文的情况下其值都会不同,并且会相应的引发一些问题。 很多程序员一看到this关键字,就会把它和面向对象的编程方式联系在一起,它指向利用构造器新创建出来的对象。在ECMAScript中,也支持this,然而, 正如大家所熟知的,this不仅仅只用来表示创建出来的对象。 接下来给大家揭开在ECMAScript中this神秘的面纱。 定义 This是执行上下文的一个属性: activeExecutionContext = { VO: {...}, this: thisValue }; 这里的VO就是前一章介绍的变量对象。 ...
Oct 9th
2 tags
变量对象(Variable object)
说明 此文译自Dmitry A.Soshnikov 的文章Variable object 另,此文还有另外一位同事(宋珍珍)共同参译 概要 我们总是会在程序中定义一些函数和变量,之后会使用这些函数和变量来构建我们的系统。 然而,对于解释器来说,它又是如何以及从哪里找到这些数据的(函数,变量)?当引用一个对象的时候,在解释器内部又发生了什么? 许多ECMA脚本程序员都知道,变量和执行上下文是密切相关的: var a = 10; // 全局上下文中的变量 (function () { var b = 20; // 函数上下文中的局部变量 })(); alert(a); // 10 alert(b); // "b" is not defined ...
Oct 7th
1 note
September 2011
5 posts
2 tags
安装node后node的js代码都跑哪里去了
Node的源代码有两部分组成: 1. C/C++代码(包括Google的V8引擎代码): 位于src目录下 2. JavaScript代码:node.js位于src目录下,其余全部位于lib目录下,而且数量很多 但是,奇怪的是,按照node wiki上的安装文档安装好Node之后,却发现在安装目录中并没有任何JavaScript文件,于是我就很想知道为什么(我犯贱) 因为node运行的时候这些js代码都是需要的,而且基本是node的核心代码, 所以大致猜测:JS文件在make的过程中可能被翻译然后合并到C代码中一同编译成了二进制代码 通过粗略地看了下node的几个和安装相关的脚本文件后,大概知道了真正的原因,如下: 首先,回忆下node的安装过程: 1. ./configure —prefex=node_install_path:...
Sep 28th
2 notes
3 tags
执行上下文(Execution Context)
说明 此文译自Dmitry A.Soshnikov 的文章Execution Context 概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型。 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文。 执行上下文(简称:EC)是个抽象的概念,ECMA-262标准中用它来区分不同类型的可执行代码。 标准中并没有从技术实现的角度来定义执行上下文的具体结构和类型;这是实现标准的ECMAScript引擎所要考虑的问题。 一系列活动的执行上下文从逻辑上形成一个栈。栈底总是全局上下文,栈顶是当前(活动的)执行上下文。当在不同的执行上下文间切换(退出的而进入新的执行上下文)的时候,栈会被修改(通过压栈或者退栈的形式)。 可执行代码类型 ...
Sep 10th
2 notes
4 tags
npm中本地安装命令行类型的模块是不注册Path的
首先有必要解释下什么是命令行(Command Line)类型的模块。 npm的模块一共分为三类: 1. 绑定型(Binding):本地模块,C++书写,如node-png 2. 库型(Library):JS书写,直接使用require(‘module’)这种方式,如Socket.IO-node 3. 命令行型(Command Line): 以命令行形式使用,如json-command 显而易见,提供命令行形式调用方式的模块就属于命令行型的。那么如何来申明自己的模块以什么命令调用,调用执行代码又如何制定呢? 这里就要说到npm模块的核心文件:package.json,此文件是npm模块的配置信息(npm help json可以获取详细信息)。 其中有一个key就叫“bin”,具体形式为“{ “bin”:...
Sep 5th
16 notes
Sep 4th
4 tags
如何在Eclipse中自定义Bundle
写代码的时候,我经常有这样的需求: 希望把经常要写的代码做成模板,然后,像linux那样,输入部分字符,按下Tab就帮忙自动补齐 以前用Netbeans和TextMate(Bundle)的时候,就很喜欢这样。 现在,在Eclipse + Aptana的环境下,也希望能够有这样的感受。于是,摸索出了自定义Bundle的方法,如下所示: 说明: “Eclipse3.7环境下,” 场景: 我经常在文件最上面要写上作者信息比如:goddyzhao<[email protected]> 所以,我打算把这个作为一个snippet,下次直接输入”auinfo”,然后tab就帮我自动补齐。 具体步骤如下: 1. 点击”Commands” -> “Text” -> “Edit...
Sep 3rd
4 notes
August 2011
6 posts
3 tags
Spawn a process from a build that lives longer...
在做持续集成的时候,可能会有这样的需求: 在Build过程中,需要启动一个服务器,用来监听服务请求等等 这样的情况,通常build进程本身会启动服务器,然后服务器就一致处于监听状态。 这样就带来了一个问题:由于服务器一直处在监听状态,因此,build进程一直无法结束,就导致了build就被hold住了,永远结束不了。 举个例子: 假设Build过程中需要调用一个ant任务,该任务就负责启动一个jetty服务器,然后一直监听着: ant runserver 这个时候就会把build过程hold住了。 如何解决这个问题呢?第一反应就是build过程中,想办法调用一个shell脚本,然后利用linux/unix的后台运行能力来解决这个问题。(利用nohup 或者 &): 创建一个shell脚本: #!/bin/bash nohup ant...
Aug 24th
2 notes
4 tags
使用Nodejs来编写Hudson(Jenkins)构建代码
Update:Jenkins的使用方式和如下一致! Hudson中默认的Build方式有四种,分别是: Shell脚本 Windows的批处理命令 调用Maven2任务 调用Ant任务 调用Maven3任务 如下图所示: 这5种方式,除了shell和ant之外,其他我都很生疏。作为前端工程师,俺最熟悉的还是JavaScript,所以,自然而然就想到了,要是能够用JavaScript写构建代码就爽多了! Hudson强大的插件系统解决了我的问题,通过安装nodejs的hudson插件,就可以实现我的需求了,具体步骤如下: 安装nodejs插件 “点击” Manage Hudson -> Manage Plugins -> 选择Available标签 -> 找到nodejs plugin 点击“Install”进行安装 ...
Aug 24th
8 notes
3 tags
使用Hudson(Jenkins)进行简单的持续集成
Update: Jenkins的配置也是类似,唯一不同的是,它内置不支持git,需要安装一个git插件之后才能使用git来作为Source Code Management 通过将Jetty集成Hudson,成功启动Hudson之后,接下来 尝试一个极其简单的使用Hudson的例子,简单到什么地步呢? 就是简单到啥也不干,就让hudson去拉项目代码,然后结束! 步骤如下: New Job 进入Hudson(默认http://localhost:8080/hudson)首页之后, 点击New Job来新建一个任务,并填写相应的说明。 进行详细的配置步骤。这里只设置“Source Code Management”。配置git路径,让hudson从指定git库去拉项目代码 最后点击Save。之后点击左侧的“Build Now” ...
Aug 24th
3 notes
4 tags
Jetty集成Hudson(Jenkins)
Hudson是流行的持续集成服务器,关于它我就不多做介绍了,因为我自己了解的也不多,没介绍的资格! 我的终极需求只是给项目提供一个持续集成环境,希望每次提交代码之后的一些测试的工作,build的工作都能够自动化完成,出错了还能够report我。所以,这里hudson就是我的选择。 Hudson有多种安装方式: 1. War包 2. 针对不同系统的独立安装包 这里采用War包,并以Jetty作为集成服务器。具体搭建步骤如下: 到Hudson官方下载页面下载War包 下载jetty(这里以6.1.26为例) 将jetty解压到指定的目录下(记为:JETTY_HOME) 将war包复制到 JETTY_HOME/webapps下 启动jetty ...
Aug 24th
1 note
3 tags
bashmarks——终端利器
作为终端控,经常要使用命令来定位要访问的目录,于是,“cd path”这种命令每天不知到要打多少次。对于一些结构比较深的目录(尤其是要经常访问的),使用cd命令起来真的是噩梦(尽管有tab神器,依旧让我感觉非常不爽)。 这个时候,一种自然而然的想法就是能否对于我经常访问的目录,建立一个快照(书签),之后,每次打开终端只需要直接读取书签即可,类似于下面这种命令: > save bookmark_name  # 将当前路径保存为名为bookmark_name的书签中 > goto bookmark_name # 直接访问bookmark_name书签描述的目录 这种和浏览器的书签类似,但是,终端天生的优势就是完全命令行操作,这要比鼠标操作爽多了! ...
Aug 24th
2 notes
2 tags
Windows下使用RubyMine调试Rails
当代码量逐渐变大、逻辑逐渐变复杂、嵌套层逐渐变多、调用关系也逐渐变复杂的时候,单纯靠puts打log的方式,感觉有点麻烦。尤其是在不同文件中加入了调试代码,之后想要删除的时候还要全局搜索下,然后逐个删除,很不爽。 由于以前写Java的时候用eclilpse调试Java代码,感觉非常不错,因此这里也介绍借用IDE来辅助Debug的方式。 之所以用RubyMine是因为以下两个原因: RubyMine虽是收费的,但是它有Open Source Project和Classroom License两种Free的版本 Netbeans从7.0开始不内置Ruby模块了,需要手动安装。这多多少少能够看得出Netbeans对Ruby的态度。 下面介绍详细过程(Windows7): 安装Ruby、Gem、Rails ...
Aug 24th
2 notes