寻人启示

lyongde 同学,请尽快将你的名字发到我的邮箱里面(lsf.email[at]gmail.com),以便在第二次印刷时加到译者序中以表感谢。

儒家经典《大学》将“格物致知”奉为做学问、养身性的最高境界。

尼古拉斯•扎卡斯重新修订的这个最新版本,为各层次的JavaScript爱好者和Web前端开发人员提供了一条“格物致知”的捷径。

新版本的原书不仅篇幅由原来的600多页增加到800页,而且几乎全部更新、重写了上一版的内容,删除了上一版中与今天的职业需求无关的主题,新增了大量比上一版更有价值、更能反映JavaScript最新发展成果的内容。从颇具深度的JavaScript语言基础到作用域(链),从JavaScript引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)到客户端检测,从文档对象模型(DOM)到基于事件的Web脚本编程,从错误处理到前端调试,从XML(E4X)到Ajax及JSON,从高级前端开发技术到前沿的客户端存储,从最佳编程实践到展望即将成为现实的API,直至JavaScript未来的发展。全书基本上囊括了JavaScript技术的各个方面,几乎涉及到了Web前端开发的所有热门话题。值得一提的是,本书还涵盖了当前最受开发人员关注的HTML5和移动设备(如iPhone)开发的内容。可以预见,本书一定会成为Web前端开发人员不可多得的经典之作。

需要提请读者注意的是,本书第22章讲到了JavaScript未来的变化,里面大部分讲的是ECMAScript 4/JavaScript 2,而ECMAScript 4已经被放弃了,新标准是ECMAScript 5。请读者参考http://www.ecmascript.org/。感谢周涛(Snandy)指出此问题。

本书文前和第1章至第17章由李松峰翻译,第18章至第22章及附录由曹力翻译。武卫东老师审读斧正了序的翻译,责任编辑朱巍为本书早日出版多方协调,执行编辑毛倩倩发现了译稿中多处错译和漏译,排校负责人董秋霞、谢凌老师严把三道排校质量关、谢廷晟全面审校了第1章至第17章,吴玺喆(George Wing)、吴生辉(千年一梦)、周裕波、梁超(LC)、张树恒(shuzai)、罗永德(lyongde)也审校了前17章的部分内容,为确保本书翻译质量起到了重要作用,在此对上述老师和同学致以深深的谢意。

译者
2010年5月

说明:《JavaScript高级程序设计(第2版)》(预计2010年7月份上市)的审校者谢廷晟针对书中一句关键的表述,给出了如下分析说明。虽然译者也同样意识到将this关键字函数执行时所处的作用域简单地等同起来不恰当,但在书中其他章节里,还有多处类似表述。本着不擅自修改原文的原则,谨以此说明帮助读者慎思明辨(书中也通过译者注形式给出了此文的链接)。感谢廷晟的认真审校。

第5章中有这样一句话:“this是函数在执行时所处的作用域”(《JavaScript高级程序设计(第2版)》第5章5.5.4节正文倒数第3段中)。我觉得作者的这种说法大有问题。对JavaScript不熟悉的读者会越看越糊涂。这里首先需要明确两个概念:函数执行时所处的作用域、在哪个作用域中调用函数函数调用发生的作用域,否则讨论就无法继续深入。把后一概念明确为“函数调用语句所处的那个作用域”应该没有问题。而前一个概念,实际上就是函数的定义所处的那个作用域。以下面的代码为例:


function a() {
 // ...
}

function b() {
 /// ...

 return function c() {
  // ...
 };
}

var d = b();
a();
d();

在这里,函数a、b和d(实际上就是c)都是在全局作用域中调用的。a和b执行时所处的作用域都是全局作用域。但是d执行时所处的作用域并不是全局作用域,而是函数b的局部作用域。说到这里,就可以看到“this是函数在执行时所处的作用域”这一说法的不妥了。假如函数c中引用到了this(在本例中,d是直接调用的,所以this指向的是全局对象),那么按作者的说法,c 岂不是直接运行在全局作用域中而不是b的局部作用域中了?再看下述例子:


var greeting = 'Hello from global scope!';

function e() {
 alert(greeting);
 alert(this.greeting);
}

var tom = {
 greeting:'Hello from Tom!'
};
tom.f = e;
tom.f();

这个例子中的this指向的是什么?显然是tom。那么f(即e)执行时所处的作用域是什么?显然是全局作用域。假如f执行时所处的作用域如作者所说为this所指对象的话,那就意味着在本例中f执行时所处的作用域为tom,也就是说在f执行过程中,与其作用域链相对应的那个变量对象链的最前端那个对象是tom,而这就意味着在此时函数体内对名称greeting进行解析时首先遇到的是tom中定义的greeting,于是两条输出语句的结果都应该是“Hello from Tom!”,这不符合事实,所以按作者的说法所做的那个假设是错误的。

对于this这个关键字,我认为不应该扯什么作用域的事儿,只要向读者说明以下几项这样一句话就够了:函数作为哪个对象的方法调用,函数体内的this(不包括嵌套定义在其中的函数中的this)指向的就是那个对象。直接调用一个函数,相当于把它当作全局对象的方法调用。JavaScript 中没有类作用域的概念,因此方法内部要访问据以调用此方法的那个对象的属性,必须使用this关键字,按‘this.属性名’的语法来访问

  1. 函数作为哪个对象的方法调用,函数体内的this(不包括嵌套定义在其中的函数中的this)指向的就是那个对象。
  2. 结合new运算符调用一个构造函数时,系统会先自动生成一个对象,然后在该对象上调用构造函数。此时在构造函数体内,this指向的就是这个对象。
  3. 直接调用一个函数,相当于把它当作全局对象的方法调用。
  4. JavaScript中没有类作用域的概念,因此方法内部要访问据以调用此方法的那个对象的属性,必须使用this关键字,按“this.属性名”的语法来访问。

与这个问题相关的还有一个函数体内的名称解析的问题。我看过的JavaScript教材上都说得不太全面。实际上,那种直接引用的名称,其名称解析是在作用域链上进行的;而那种按“obj.属性名”方式引用的名称,其名称解析是在obj的原型对象链上进行的(首先检查obj是否直接定义了同名属性,如果没有,则在其原型对象链上逐层查找)。理解了这一点,就更能搞清前面的this与作用域的瓜葛。

谢廷晟,《JavaScript设计模式》和《深入浅出HTML》的译者。

《JavaScript设计模式》    《深入浅出HTML》
Eclipse 3.4 (Ganymede) Eclipse 3.5 (Galileo)
  1. 启动 Eclipse,然后选择 Help > Software Updates…。在出现的对话框中,单击 Available Software 选项卡。
  2. 单击 Add Site…
  3. 在 Add Site 对话框的 Location 字段中输入下面的 URL:https://dl-ssl.google.com/android/eclipse/ 注意:如果访问该插件时遇到问题,可以将 URL 中的 https 改成 http(使用https会更安全一些)。单击 OK
  4. 回到 Available Software 界面,应该可以看到 URL 中包含的插件列表,其中有 Developer Tools 一项。选择 Developer Tools 旁边的复选框,单击 Install…。
  5. 在接来下出现的安装窗口中,应该会出现被选中的 Android DDMS 和 Android Development Tools。单击 Next
  6. 阅读并接受许可协议,然后单击 Finish
  7. 重新启动 Eclipse。
  1. 启动 Eclipse,然后选择 Help > Install New Software
  2. 在 Available Software 对话框中,单击 Add…
  3. 在 Add Site 对话框的 Name 字段中,输入远程站点的名称(例如“Android Plugin”)。在 Location 字段中,输入下面的 URL:https://dl-ssl.google.com/android/eclipse/注意:如果访 问该插件时遇到问题,可以将 URL 中的 https 改成 http(使用https会更安全一些)。单击 OK
  4. 回到 Available Software 界面,应该可以看到列表中的 Developer Tools 选项。选择 Developer Tools 旁边的复选框,会同时选中 Android DDMS 和 Android Development Tools。单击 Next
  5. 在最后的 Install Details 对话框中,会列出 Android DDMS 和 Android Development Tools 等特性。单击 Next 阅读并接受许可协议,同时安装所有依赖组件,然后单击 Finish
  6. 重新启动 Eclipse。

* 译自http://developer.android.com/sdk/eclipse-adt.html

眼下,我正在翻译Beginning Android 2(Apress,March 2010)这本书。之所以翻译这本书,一来是因为这本书比较急,而全书又有接近400页的内容需要翻译,如果找其他译者,少说得3个月;而我打算在1个月左右搞定。二来也是为了学习一下Android开发,以后审稿子也可以做到“胸有成竹”。

之所以想到公开征寻技术审稿人,一是上一本书的样章吸引了120多位朋友的热情参与(“经典名著,精选样章”),几位热心的朋友在出版前也为我指出了一些问题,而这些问题在出版前都得到了妥善解决,保证了最终出书的质量;二是在今天这个开放的环境下,如果还延续那种一个人关起门来翻译的模式,不仅会显得译者自己缺乏公开的勇气,更会拖延译稿中问题的解决(译者无法解决书中全部问题很正常),影响出书进度。况且,样章早晚都是要放出来给潜在读者先睹为快的,后放不如早放,这样也有利于潜在读者提前了解这本书的价值所在和翻译质量——“先尝后买”嘛。

当然,征寻技术审稿人的主要目的,还是为了请领域专家来给译稿把关,尽最大努力来消除翻译中存在的错误或问题,确保最终出书的质量。下面就说一说对技术审稿人的要求:

1、对Android开发有浓厚的兴趣和一定的开发经验;
2、愿意花时间“先睹为快”并有能力指出错误和问题;
3、有一定的中文文字表达能力,能够看懂英文原文。

有意参与这本书技术审校的朋友,请给我发邮件(lsf.email[at]gmail.com)吧,邮件标题请填“Beginning Android 2审校”(以便过滤归类)。

声明一下:对所有参与审校的朋友,我会在译者序中具名致谢。对参与审校而且指出问题较多的朋友,届时将赠送样书(样书可以是本书中文版,或者我翻译过的其他图书,或者图灵公司出版的其他图书——届时我们可以再商量)

另外,对于只是想“先睹为快”的朋友,也可以给我发邮件,邮件标题请填“Beginning Android 2试读”,我会给大家共享部分样章。

期待Android开发专家、高手、大牛、爱好者,伸出援手、不吝赐教!让我们共同携手,为Android开发社区和爱好者又快又好地奉献一本优秀的引进版图书。

Beginning Android 2

Beginning Android 2