最后更新时间:2011年12月12日
共91条勘误信息。其中:
1、36条已经在第2次印刷(2010年9月)的版本中修正;
2、32条已经在第4次印刷(2011年4月)的版本中修正;
3、4条已经在第5次印刷(2011年8月)的版本中修正;
4、9条已经在第6次印刷(2011年10月)的版本中修正;
5、10条将在第7次印刷(2011年12月)的版本中修正。
图示说明:
1、
:此错误仅存在于第1次印刷的版本中(后续印次中已修正,下同);
2、
:此错误仅存在于第1、2、3次印刷的版本中;
3、
:此错误存在于第1、2、3、4次印刷的版本中;
4、
:此错误存在于第1、2、3、4、5次印刷的版本中;
请读者根据自己手里书的印次核对和提交勘误。
点击查看为本书提供勘误的朋友。
快速页码导航
P3(1) |P6(1) |P11(1) |P14(1) | P15(1) | P16(1) | P18(1) | P25(1) | P30(1) | P37(1) | P39(1) | P48(1) | P63(1) | P69(1) | P81(1) | P87(1) | P89(2) | P90(1) | P91(2) | P93(1) | P100(1) | P105(1) | P107(1) | P119(2) | P120(1) | P126(2) | P127(1) | P128(1) | P133(1) | P136(1) | P140(1) | P148(1) | P152(1) | P154(1) | P161(1) | P163(1) | P169(1) | P179(1) | P191(1) | P204(1) | P217(1) | P218(1) | P221(1) | P224(2) | P233(1) | P237(1) | P245(1) | P249(1) | P256(1) | P286(1) | P294(1) | P300(1) | P315(1) | P326(1) | P344(2) | P355(1) | P378(1) | P379(1) | P387(2) | P448(1) | P466(1) | P467(1) | P468(1) | P469(1) | P470(1) | P472(1) | P510(1) | P511(3) | P527(1) | P532(1) | P533(1) | P542(1) | P544(1) | P549(1) | P551(1) | P554(2) | P557(1) | P560(1) | P568(1) | P569(1) | P570(1) | P571(1) | P577(1)
P3,图1-2中:
“EMCAScript” -> “ECMAScript”
“EMCAScript” -> “ECMAScript”
P6,正数第九行:
“……Netscapet……” -> “……Netscape……”
“……Netscapet……” -> “……Netscape……”
P11,代码,第一段中的注释:
<!- 这里放内容 -->
->
<!-- 这里放内容 -->
第二段中的注释:
<!-- <!- 这里放内容 -->
->
<!-- 这里放内容 -->
正文,倒数第一段,第一行:
“HTML4.01” -> “HTML 4.01”
P14,正文,倒数第一段:
“框架型” -> “框架集型”
“框架型” -> “框架集型”
P15,正文,第二段,第一行:
“超级文档模式” -> “超级标准模式”
“超级文档模式” -> “超级标准模式”
P16,倒数第三、四行:
“……,但只有IE支持该属性。” -> “……,但只有IE和Firefox 3.5+ 支持该属性。”
“……,但只有IE支持该属性。” -> “……,但只有IE和Firefox 3.5+ 支持该属性。”
P18,3.1.3,第一、二段:
“反斜杠” -> “斜杠”
“反斜杠” -> “斜杠”
P25,附注框:
“……正和负……” -> “……负和正……”
“……正和负……” -> “……负和正……”
P30,3.4.7上面一段:
去掉”null”和”undefined”的引号
去掉”null”和”undefined”的引号
P37,正文第四段(图3-2下方):
“注意,左移不会影响操作数的符号位。换句话说,……。”
->
“(删除这一段。因为原文这种说法不正确。——译者注)”
“注意,左移不会影响操作数的符号位。换句话说,……。”
->
“(删除这一段。因为原文这种说法不正确。——译者注)”
P39,代码,倒数第一段,第二行:
& & -> &&
& & -> &&
P48,3.6.3 while语句,第二行:
“因引” -> “因此”
“因引” -> “因此”
P63,正文第一段,第五行:
“当接下再……” -> “当接下来再……”
“当接下再……” -> “当接下来再……”
P69,4.3.1第三段第三句:
“而在此之后再被加上标记的变量” -> “而在此之后仍带有标记的变量”
“而在此之后再被加上标记的变量” -> “而在此之后仍带有标记的变量”
P81,页脚,“译者注”中:
value2-value1 –> value1-value2
value2-value1 –> value1-value2
P87,正文,项目符号后第一段:
“不同组合产生不结果,……” –> “不同组合产生不同结果,……”
“不同组合产生不结果,……” –> “不同组合产生不同结果,……”
P89,倒数第十六、十七行(修改后,每个字符串前面多了一个空格):
"and dad"、"and baby"、"and dad and baby"
->
" and dad"、" and baby"、" and dad and baby"
P89,倒数第一和第五行(注释0->3):
alert(pattern1.lastIndex);//0
->
alert(pattern1.lastIndex);//3
P90,第五行(注释0->3):
alert(pattern2.lastIndex);//0
->
alert(pattern2.lastIndex);//3
P91,表中,第一个单元格内:
Input -> input
Input -> input
第一段代码,应该如下所示(注意注释中字符串及字符串中的空格):
if (pattern.test(text)){
alert(RegExp.input); // "this has been a short summer"
alert(RegExp.leftContext); // "this has been a "
alert(RegExp.rightContext); // " summer"
alert(RegExp.lastMatch); // "short"
alert(RegExp.lastParen); // "s"
alert(RegExp.multiline); // false
}
P93,正文第二段,第二行:
“……,没用必要……” -> “……,没有必要……”
“……,没用必要……” -> “……,没有必要……”
P100,正文5.6.1标题往上数4行:
“……,而且所有基本包装类型的对象都会被转换成布尔值true。”
->
“……,而且所有基本包装类型的对象在布尔环境中都会被转换成布尔值 true。”
“……,而且所有基本包装类型的对象都会被转换成布尔值true。”
->
“……,而且所有基本包装类型的对象在布尔环境中都会被转换成布尔值 true。”
P105页,倒数第二行:
alert(pattern.lastIndex //0
->
alert(pattern.lastIndex); //3
P107,第一行:
“表示应该被替换的匹配项使用函数……” -> “表示应该被替换的匹配项。使用函数……”
“表示应该被替换的匹配项使用函数……” -> “表示应该被替换的匹配项。使用函数……”
P119,倒数第三段,第三行:
“……在所函数的指针” -> “……所在函数的指针”
“……在所函数的指针” -> “……所在函数的指针”
P119,这一页多次出现“原型属性”或“prototype属性”等不恰当表述,应该改为“原型对象”。为准确起见,这里给出一个与目前纸版书大致相同的PDF页面,并用修订版式标出了修改的地方(直接点击打开,右键点击选“链接另存为”可以下载):
P119页的修订页面(PDF,347KB)
P119页的修订页面(PDF,347KB)P120,图 6-1:
Person1、Person2 -> person1、person2
Person1、Person2 -> person1、person2
P126,图6-3,上下两幅子图中,含有__proto__的两个方框:
“Person” -> “person”
“Person” -> “person”
P126,图6-3,第二个子图的标题:
“重写原型对象之前”
->
“重写原型对象之后”
“重写原型对象之前”
->
“重写原型对象之后”
P127,第20-21行,即灰色框上面倒数第一行:
“mgs” -> “msg”
“mgs” -> “msg”
P128,代码,第二段,第7行:
Person.protoype -> Person.prototype
Person.protoype -> Person.prototype
P133,第一段第二句:
“最终结果就是这样的:instance指向……。”
->
“最终结果就是这样的:instance指向SubType的原型,SubType的原型又指向SuperType的原型。”
“最终结果就是这样的:instance指向……。”
->
“最终结果就是这样的:instance指向SubType的原型,SubType的原型又指向SuperType的原型。”
相应地,P133页下方的“译者注”:
“实际上,不是SubType.prototype的……。——译者注”
->
“实际上,不是SubType的原型的constructor属性被重写了,而是SubType的原型指向了另一个对象——SuperType的原型,而这个原型对象的constructor属性指向的是SuperType。——译者注”
P136,第一段代码,第二行后面的注释应该在第三行后面。
P140,图6-6,左侧第一列对象框,上数第二个对象框中的函数名称:
SubType -> SuperType。
SubType -> SuperType。
P148,代码第一段,倒数第二行:
document.write(funcs[i]() + "<br />");
改为:
document.write(funcs[i](i)() + "<br />");
P152,代码三中的注释。
//函数的私有变量 -> //私有变量和私有函数
//函数的私有变量 -> //私有变量和私有函数
P154,第一段代码,倒数第二行:alert(person1)…->alert(person)…
P161,倒数第三段,倒数第二行:
“在Firefox和Safari中,screenTop……”
->
“在Firefox和Safari中,screenY或screenTop……”
“在Firefox和Safari中,screenTop……”
->
“在Firefox和Safari中,screenY或screenTop……”
P163,第二段代码:
window.open("http://www.wrox.com/", topFrame");
->
window.open("http://www.wrox.com/", "topFrame");
P169,正文第三段第四行:
“……,那么这个两……”
改为:
“……,那么这两个……”
“……,那么这个两……”
改为:
“……,那么这两个……”
P179,正文倒数第二段第一句:
“……document.getElementsById()……” -> “……document.getElementById()……”
“……document.getElementsById()……” -> “……document.getElementById()……”
P191,代码第一段阴影部分:
engine.ver = browser.ver = RegExp["$1"]; engine.ie = browser.ie = parseFloat(engine.ver);
改为:
engine.ver = RegExp["$1"]; engine.ie = parseFloat(engine.ver);
P204,正文第一行:
“DOM(档对象模型)……” -> “DOM(文档对象模型)……”
“DOM(档对象模型)……” -> “DOM(文档对象模型)……”
P217,正文第一行:
“……字符串”</scr>” + “ipt>”……” -> “……字符串”</scr” + “ipt>”……”
“……字符串”</scr>” + “ipt>”……” -> “……字符串”</scr” + “ipt>”……”
P218,正文第一段第二行:
“……;而在XML(包括XHTML)中,……” -> “……;而在XML(有时候也包括XHTML)中,……”
“……;而在XML(包括XHTML)中,……” -> “……;而在XML(有时候也包括XHTML)中,……”
P221,正文(阴影框中)倒数第一行:
“尽管IE8已经解决了这些问题,但我们仍然不建议通过属性来设置特性。”
->
“尽管到了IE8才解决这些问题,但我们还是推荐通过属性来设置特性。”
“尽管IE8已经解决了这些问题,但我们仍然不建议通过属性来设置特性。”
->
“尽管到了IE8才解决这些问题,但我们还是推荐通过属性来设置特性。”
P224,正文倒数第一行:
“nodeTpye” -> “nodeType”
“nodeTpye” -> “nodeType”
P224,正文第六行(列表第三项)中:
“<buttou>” -> “<button>”
“<buttou>” -> “<button>”
P224,正文倒数第一行:
“nodeTpye” -> “nodeType”
“nodeTpye” -> “nodeType”
P233,正文倒数第二段,第一句:
“结果” -> “result”
“结果” -> “result”
P237,代码倒数第一段,第一行:
... onclick=\"alert('hi")\"....
->
... onclick=\"alert('hi')\"....
P245,代码第二段,加阴影的那一行:
for (var i=0 len=divs.length; i < len; i++){
->
for (var i=0, len=divs.length; i < len; i++){
P249,正文第12行:
……,其 nodeName 等于 prefix+" : "+ ocalName。
->
……,其 nodeName 等于 prefix+" : "+ localName。
P256,正文第二段最后一句:
“以下代码既输出CSS属性值,也输入值的类型”
->
“以下代码既输出CSS属性值,也输出值的类型”
“以下代码既输出CSS属性值,也输入值的类型”
->
“以下代码既输出CSS属性值,也输出值的类型”
P286,代码第三段,倒数第2行:
< /script >
->
</script>
P294,表格后第一段文字,第二行中的:
event.srtElement
->
event.srcElement
event.srtElement
->
event.srcElement
P300, “4.相关元素”下第一行:
“mouserout” -> “mouseout”
“mouserout” -> “mouseout”
P315, 中间代码段中所有的斜双引号,改为直双引号:
P326,正文第二个列表第三项:
“changeTouches” -> “changedTouches”
“changeTouches” -> “changedTouches”
P344,正文第二行括号中:
“<inpu>元素” -> “<input>元素”
“<inpu>元素” -> “<input>元素”
P344,正文第三行开头:
“<textarea/>” -> “</textarea>元素”
“<textarea/>” -> “</textarea>元素”
P355,代码,第二段:
selectbox.remove(0);
改为:
selectbox.remove(i);
P378, 代码第二段,加阴影的那一行:
if (typeof.values.sort == "function"){
->
if (typeof values.sort == "function"){
P379, 代码第二段,第三行(问号后面的查询字符串中多了两个空格):
"http://www.someotherdomain.com?a=b &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; c=d");
->
"http://www.someotherdomain.com/?a=b&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;c=d");
P387,正文第一行:
“由于不能在COM对象……” -> “由于不能在DOM对象……”
“由于不能在COM对象……” -> “由于不能在DOM对象……”
P387,正文第二段(14.5.4第一段),倒数第一句:
“<span>” -> “<p>”
代码第一行:
“<span>” -> “<p>”
代码第一行:
span.innerHTML = "<div>Hi</div>" //这里,span包含了<div>元素
->
p.innerHTML = "<div>Hi</div>" //这里,p包含了<div>元素
P448,代码第二段,第二行(条件赋值部分的第二个值多了两个空格):
url += (url.indexOf("?") == -1 ? "?" : " &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; ");
->
url += (url.indexOf("?") == -1 ? "?" : "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;");
P466,正文,第三段,第三行:
“……被返回的数组的第一个元素应该是第二个参数” -> “……被返回的数组包含从第二个参数开始的所有参数”
“……被返回的数组的第一个元素应该是第二个参数” -> “……被返回的数组包含从第二个参数开始的所有参数”
P467,18.2第一段,第三行:
“……某个执行时间” -> “……某个时间执行”
“……某个执行时间” -> “……某个时间执行”
P468,正文,第四段,第一行:
“事件处理器设置了一个250ms中调用的定事器” -> “事件处理程序设置了一个250ms后调用的定时器”
“事件处理器设置了一个250ms中调用的定事器” -> “事件处理程序设置了一个250ms后调用的定时器”
P469,代码,第一行:
//单调用 -> //早调用
//单调用 -> //早调用
P470,中间阴影框的第二行:
“跨浏览器” -> “跨窗口”
“跨浏览器” -> “跨窗口”
P472,第五段(三级标题18.2.3上面一段):
“……200ms以上的事件……” -> “……200ms以上的时间……”
“……200ms以上的事件……” -> “……200ms以上的时间……”
P510,代码倒数第二行(加阴影的那一行):
for (var i=values.length; i >= 0; i--) {
->
for (var i=values.length-1; i >= 0; i--) {
P511,代码第二段:
var i = values.length;
do {
process(values[i]);
} while (i-- >= 0);
->
var i = values.length-1;
do {
process(values[i--]);
} while (i >= 0);
P511,代码倒数第二段,第二行:
var iterations = Math.ceil(values.length / 8);
->
var iterations = Math.floor(values.length / 8);
P511, 正文倒数第二行:
“然后根据取整的上限函数……” -> “然后根据取整的下限函数……”
“然后根据取整的上限函数……” -> “然后根据取整的下限函数……”
P527,代码,第一段:
Var classNames = div.className.split(/\s+/);
//找到要删除的类名
varpos = -1;
for (vari=0,len = className.length;i<len;i++){
if(classNames[i] == "user"){
pos=i;
break;
}
}
//删除类名
classNames.splice(i,1);
->
var classNames = div.className.split(/\s+/);
//找到要删除的类名
var pos = -1;
for (var i = 0, len = classNames.length; i<len; i++){
if(classNames[i] == "user"){
pos = i;
break;
}
}
//删除类名
classNames.splice(pos,1);
P532,代码,第一段,第二行(value属性前应该有一个空格):
<input type="button"value="Play" id="video-btn" />
->
<input type="button" value="Play" id="video-btn" />
P533,代码,第一段:
If ->if
Var -> var
If ->if
Var -> var
P542,代码,倒数第一段,第五行(var与row之间应该有一个空格):
varrow=results.rows.item(i);
->
var row = results.rows.item(i);
P544,第二个有序列表,:
删掉事件名前面的句点。
删掉事件名前面的句点。
P549,代码,第三段,第六行:
set ame(value){
->
set name(value){
P551,代码,第一段,第三行(R应为小写的r):
Return (item > 2);
->
return (item > 2);
P554,代码,第一段,第三、四行:
for (var i=0; I < 10; i++){
Yield I * 2;
}
->
for (var i=0; i < 10; i++){
yield i * 2;
}
正文第二段,第一句:
“my Numbers” -> “myNumbers”
P554,代码,倒数第一段,第八行(let与value间应有一个空格):
letvalue=iterator.next();
->
let value = iterator.next();
P557,代码,第二段,第一行:
var {age:personage} = person;
->
var {age:personAge} = person;
P560,正文,倒数第一行(typeof与null之间应该有一个空格):
“如typeofnull……” -> “如typeof null”
“如typeofnull……” -> “如typeof null”
P568,代码,倒数第一段,倒数第一行(最后少了一个括号):
alert(person.getPersonType();
->
alert(person.getPersonType());
P569,22.1.11节,正文第二段,倒数第一行:
“oisMyClass” -> “o is MyClass”
“oisEventTarget” -> “o is EventTarget”
“oisMyClass” -> “o is MyClass”
“oisEventTarget” -> “o is EventTarget”
P570,正文第一段,倒数第一行:
“meisPerson” -> “me is Person”
“meisEmployee” -> “me is Employee”
“meisPerson” -> “me is Person”
“meisEmployee” -> “me is Employee”
P571,正文倒数第一段,第三行开头(I应该为小写的i):
“Iterator命名空间……” -> “iterator命名空间……”
“Iterator命名空间……” -> “iterator命名空间……”
P577,代码,第二段(页面中部的代码),最后一行:
alert(mapg.et("statusbar"));
->
alert(map.get("statusbar"));
特别鸣谢以下热心朋友提供勘误。
- @Hiro(21)
- @凌空一叶(17)
- @Daild(6)
- @余秉烨(5)
- @sunnylost(4)
- @dishuostec(3)
- @air(3)
- @裕波(2)
- @gengv(2)
- @jlulamplamp(2)
- @snowqiang(2)
- @Franko(1)
- @千年一梦(1)
- @yuhu(1)
- @lpbottle(1)
- @lenter(1)
- @孙博(1)
- @东方龙马(指出本勘误中的错误)
- @Alpha tang(指出本勘误中的错误)
为之漫笔(李松峰),本博客专注于Web前后端技术、移动平台开发技术、交互设计和技术翻译。声明一下,因为时常需要外出审稿,而且基本不带笔记本,所以有时可能会迟一点回复大家的留言。
P89的两个错误, 怎么勘误左右都一样?
哦 空格和注释的区别…
P126,图6-3,第二个子图的标题:“重写原型对象之后”->“重写原型对象之前”。
上下两个子图的标题都是”重写原型对象之前”, 何解?
@dismory 多谢提醒,现在应该清楚一些了。
记得发现三个的,结果今天回头找就记起来了两个:
p136 :
第二行:instance1.colors.push(“black”); //”red,blue,green,black”
后面的//”red,blue,green,black” 应放在下一行 alert(instance1.colors);的后面
p154 :
alert(person1.getName()); //”Michael”
此处person1应为person
对照上面给出的勘误,发现了p105的那个问题我也发现了,呵呵。
@Hiro 这么快!
没看文章就发表勘误,原来三个问题都被发现了,汗,好强悍的读者们啊!
@Hiro P136、P154那两个勘误是我根据你的勘误刚刚放上去的
Nichols C.Zakas今年3月又出了一本《High Performance Javascript》,不知道李老师会翻译这本么?
@guilipan 你说的这本书大概已经名花有主了。
P22页的矩形框中的有关undefined部分的论述让人不知所云,前后矛盾啊
@Moon 哪里矛盾呢?或许是那段文字不太好理解吧。
我试着解释一下这段话的意思,看能不能帮你理解:P21到P22的代码示例表明,对未初始化的变量(也就是声明了但还没有赋值的变量,即例中的message)和未声明的变量(即例中的var)使用typeof操作符都会返回”undefined”。显然,如果养成了只声明变量而不给变量赋值的编码习惯,那将来在复杂一些的代码中再遇到typeof返回”undefined”的情况,就不容易区分被检测的变量到底是未初始化的,还是根本就没有声明过的了。
基于以上理解,这个提示框对读者给出了建议:“即便未初始化的变量会自动被赋予”undefined”值,但显式地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回undefined值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。”
如果经过我的解释你才理解了这段话,那说明这个提示框中的译文确实有问题,我现在把它修改成这样:“即便未初始化的变量会自动被赋予”undefined”值,但我们仍然建议读者养成显式初始化变量(即在声明变量的同时给变量赋值)的习惯。如果能够做到这一点,那么当typeof操作符返回undefined值时,我们就知道被检测的变量是还没有被声明的,而不是尚未初始化的了。”
你觉得怎么样?
P141 第一段代码的第二行var = prototype = object(superType.prototype); -> var = prototype = Object(superType.prototype); object – > Object
@Franko
为什么要把object改成Object?这好像不是错误啊,object是P138定义的函数。
P163页,window.open(“http://www.wrox.com/”,topFrame¡”);topFrame少左引号
P179,IE5.0之前的版本不支持document.getElementsById()这个方法,多了个s,–>document.getElementById();
P224,第六行,动态创建的type特性值为”reset”的元素重设不了表单,中间的buttou–> button
p224,最后一行的nodeTpye–>nodeType
P378,第17行的
if(typeof.values.sort == “function”) typeof后面多个“.”
那个p245的错误,应该是“,”号吧,若是分号,则len就为全局变量了!!
@Hiro 呵呵,是的;已经改正。
261页的offsetLeft解释
“元素的左外边框至包含元素的左内边框之间的像素距离”
应该是左外吧,左内的话,那包含元素的边框就不计算在内了,
我测试过和网上找了一些介绍,例如”offsetLeft:获取当前对象到其上级层左边的距离.”
@air 应该没错。“包含元素”是指包含当前元素的元素,见图11-1。另外,该页倒数第一段第一句“……,包含元素的引用保存在offsetParent属性中”说明了“包含元素”的含义,即包含元素是当前元素的直接上级(parent)元素。
问个问题:
Object.constructor 与 Object.prototype.constructor 的区别是什么?
回Moon
我的理解是:
Object.constructor //引用对象的constructor方法
Object.prototype.constructor //为constructor设置新的方法
错了,是为Object
Object.prototype.constructor //为Object设置新的方法
344页第二行 类似于元素的…. 缺了个t
另外问一下,近期有没有翻译哪本大作的计划呢?
象9月的JavaScript Bible, 7th Edition,年底的js权威指南第六版,DOM Scripting第二版等.
387页第一行,”由于不能在COM对象被销毁之后”
应该是DOM,原书也错了
另外14.5.4
span.innerHTML
原文是p.innerHTML,
其实表达的意思是一致,
不过p元素虽然不是行内元素,但是从语义上(也就是原文的技术上)来说,p也是不可以包含块元素的.
各标记包含关系http://dl.javaeye.com/upload/attachment/80840/a231f8fd-cb89-38f1-be48-d8d2aa62ee51.gif
先说声抱歉,由于没仔细读这章…
P387,正文第一行:
“由于不能在COM对象……” -> “由于不能在DOM对象……”
这里根据前文,应该没问题,就是没找到相关介绍.希望尽快删除我的相关评论,以免误导,呵呵
@air
昨天看到松峰老师把这条勘误发出来,就觉得有点奇怪,不符以往的水准哈,估计是太忙了,没时间细看上下文。此处“勘误”所在小节前面不是说IE里的DOM对象就是以COM对象形式存在,所以后面说DOM或者COM都可以。
今天晚上读了华章出的那本标榜为“设计模式领域的又一里程碑之作”的《设计模式之禅》,中国人写的书,还一大堆严重错误,引用几句英文原文定义,“o1 is substituted for o2”居然给翻译成“o1代换成o2”,又白纸黑字的印着“覆盖或实现父类的方法时输入参数可以被放大”这样的话,彻底对华章绝望了。华章的书错误一大推,几乎没有一本书发过勘误,不知道是怕影响销量还是啥,害得每个读者花了书钱,还要给这本书当责任编辑。华章当自己比新三国的曹操还牛,人家“知错改错不认错”,至少还有一条是好的。
前几天在豆瓣上看到博主写的《翻译二、三事》(http://www.douban.com/online/10363569/discussion/22714923/),你提到的“某出版社听说我辞职了”,我大概也猜到是谁了。看到这里《JavaScript高级程序设计(第2版)》勘误发到30多条,不得不佩服译者和图灵的胸怀和勇气。毕竟错误是难免的,即便是大名鼎鼎的MIT出版社,其《算法导论》第二版原版印刷10余次了,发布的勘误达上百条(包括50多个严重错误,100多个微小错误),作者甚至还专门为此设计了一个勘误的排序程序,按印次、勘误位置、严重性、提供者显示错误,方便大家查找。(http://www.cs.dartmouth.edu/~thc/clrs-2e-bugs/bugs.php),读者也并未因为勘误多而放弃这样的好书。希望图灵网站以后也能出现这样贴心的勘误程序。
@air @凌空一叶
COM改DOM一处,我在确认发表勘误之前查过原文。根据上下文,那句话中的COM和DOM确实是一个意思,不改似乎也没问题。但毕竟读者(@air)感觉在中文语境下说“COM对象被销毁之后……”有问题,而作为译者应该始终把读者的意见放在第一位,在这种可改可不改的情况下,读者的意见大于译者的想法。况且,改起来也容易,呵呵。所以,就改了。
同样,读者@Moon也指出了P22页的一句话不好理解。我仔细看了一下,那句话虽然没有翻译错,但确实拘泥于原文字面了,读一遍都理解不了。既然不好理解,就是问题。所以,也改了。
上周,本书第二次印刷的工作单下来了,上述36处勘误都已经提交,将在第二次印刷的版本中得到修正。如果大家觉得COM改DOM不妥,可以在第三次印刷时再改过来。
@凌空一叶
翻译的书里面有错,理当认真改正,更何况这本书得到了那么多朋友的关注呢。说到胸怀和勇气,实在谬奖了,愧不敢当啊!
《算法导论》原版发表勘误的方法确实值得学习。今天,我们审稿时还说起图灵有两本经典书明年要有新版了,出新版的时候还要再仔细看一看,争取做到尽善尽美一点呢。这本书的勘误也给了我们砥砺了。
对了,你找bug得的积分足够一本书了,想要什么书,只管说。
『而作为译者应该始终把读者的意见放在第一位,在这种可改可不改的情况下,读者的意见大于译者的想法。况且,改起来也容易,呵呵。所以,就改了。』
记得侯捷博客也曾谈及他对勘误的坚持以及出版社对此的一些考量。松峰老师说“改起来也容易”,其实从侯捷博客才知道,当时改一处错误,这个页码连带的几十页所在的印张都要重新制版(不知道现在还是不是这种情况),并不是所有出版社都愿意出这笔费用的,有时亦不得不做一点妥协,放弃每次印刷都更新勘误,而先在网络上发布勘误累计到一定程度再去重新制版,台湾的网络比内地普及得早,这种方式在也是多方可以接收的。侯捷和内地的潘爱民的书有个奇怪的现象,国内不少读者宁可买他们译的老版本,也不愿意接其他译者的新版,这恐怕就是译者的口碑和魅力吧!
至于找bug的积分,今年图灵出的一本新书《深入浅出Ext JS(第2版)》比较感兴趣,现在OA用这个JS框架的也比较多。如果方便,还请松峰老师惠赐签名。
@凌空一叶
> 这个页码连带的几十页所在的印张都要重新制版
我猜想这可能是因为某一页的修改造成了页码变动,结果至少一章后面几十页的页码都要跟着变。不过,这种情况说的应该是铅字排版时代。
> 不知道现在还是不是这种情况
现在早已经都是激光照排了,即使修改造成了页码变动,也不会影响那么多页。排版人员可以调整字距、行距、段距,把需要变动的页面量控制在最少。
> 并不是所有出版社都愿意出这笔费用的
如今,重新出片和印制花费很少,理论上应该没有哪家出版社会为省这点小钱而不想给重印书做勘误;放到网上“下不来”的勘误多半都是因为书卖得不好,没有机会重印了。现在各家出版社做勘误真正难在没有读者反馈勘误,到了重印的时候“无米下锅”。这本书能及时收到这么多朋友反馈的勘误,确实是很难得的。
> 还请松峰老师惠赐签名
没问题。把你的一些简单介绍发给我吧(姓名、单位、职位、技术专长、兴趣领域、手机、地址、邮编),以便放到赠书数据库里申请赠书。
感谢松峰老师!简要资料已发至[email protected]。
下午收到debug活动 松峰老师的签名赠书,非常兴奋!说来参加这个活动,也是自己数学专业养成的一种惯性,遇到问题,没有解决总不能释怀,虽不至夜不能寐,却也同郭靖学降龙十八掌一样无暇旁顾,即便是黄蓉的美食也食不甘味。可能这就是理科的人都有的“罩门”吧,太过执着而少了一分灵动。
人邮有本书宣传文案写得很好:“像艺术家一样浪漫,像工程师一样严谨”,学习一些web前端知识,摆弄摆弄设计,也算是对自己性格的一种调和吧。 再次感谢松峰老师为我们带来的这本译作!
这么快就收到了?别客气,常联系。
想问问老师,在p155页的第一段代码中,singleton的定义是不是用私有作用域的方式啊?
@car123472
第一段代码定义并立即执行了一个匿名函数,该函数返回的singleton对象的方法可以访问它自己的(封闭在该匿名函数中的)私有变量和私有函数。
发现一错:
p256 正文第二段最后一句:
“以下代码既输出CSS属性值,也输入值的类型”
===》
“以下代码既输出CSS属性值,也输出值的类型”
你确认下吧!!
P469,倒数第4行,“结果在5ms处添加的…”,似乎应该是“结果在205ms处添加的…”。
P470,中间阴影框的第二行,“跨浏览器”应为“跨窗口”。
P140 :怀疑原书的问题,
SubType.prototype = new SuperType()的过程配图,上半部分 SubType 是否应为 SuperType ?
@snowqiang
确实是一处错误,多谢指出。
P152: 7.4私有变量
// 函数的私有变量 -> // 私有变量和函数
好久没在松峰老师博客留言了,刚路过,看见以前留言讨论过的P119,“原型属性”或“prototype属性”的问题,给发出来了,建议把中文版P133页第一段中类似的问题也修改下。中文书原文我用修正液涂了,只好给出英文的原文
So instance points to SubType.prototype, and
SubType.prototype points to SuperType.prototype
改为
So instance points to SubType Prototype, and
SubType Prototype points to SuperType Prototype
这样比较明确点,可能这页的译者注也要修改下
好久没看这本书了,昨晚翻了几页,又发现个错误:
P294,表格后第一段文字,第二行,event.srtElement改为event.srcElement
p161页,倒数第三段的倒数第二行“在Firefox和Safari中,screenTop……”中的screenTop应该为screenY。
315页,中间那段代码的所有双引号都用错了!
感谢这几天提供勘误的朋友,勘误表已经更新了!
PS:这几天外出审稿,所以没有及时回复和更新。