对于学习前端,学习javascript,犀牛书是一本很好的书,很系统的介绍了JS的具体知识,所以很厚重,对于这么厚重的一本书,翻译是一个很大的挑战,能够将这么厚一本原版书翻译成中文,并出版,着实不易,而且翻译的整本书的质量,总体上来说也是非常不错的,是学习JS的不错的书籍。
我也很庆幸自己买了一本来看,这对我学习js确实有很大的帮助,让我既可以系统的了解js的大概知识体系,也可以细嚼其细节知识。但是在阅读的过程中,我有时候会感到十分困扰,因为有时候我会觉得我读不懂那句话,不能理解其意思,(其中可能会和我的基础知识的掌握程度有关,毕竟我只是一个学英语的,对于计算机方面的许多知识并没有太多的了解。)
随着阅读的深入,和自己对js的了解逐渐累积,我开始阅读英文原版,特别是中文句子读不懂的地方,将其进行中英对照看,然后事情开始变得不太一样了。
在阅读的过程中,我渐渐的发现了一些问题,一些关于翻译的问题,中文读不懂的地方,看英文却可以大概理解意思。而且还发现有的地方的翻译的问题还挺大的,这两天在看函数那一章,这里将我发现的认为有问题的地方记录一下,也算是做一个笔记。也希望大神能对我的理解给出一些建议,帮助我对下面这几段话的理解。(因为也许原文的翻译表达到位了,只是我没能理解到。)
关于实参对象的,第175页,代码上面那一段文字,
先看中文,
数组对象包含一个非同寻常的特性,在非严格模式下,当一个函数包含若干形参,实参对象的数组元素是函数形参所对应的别名,实参对象中以数字为索引,并且形参名称可以认为是相同变量的不同命名。通过实参名字来修改实参值的话,通过arguments[]也可以获取到更改后的值。
再看英文原文,
the Arguments object has one very unusual feature.In non-strict mode,when a function has named parameters,the array elements of the Arguments object are aliases(别名) for the parameters that hold the function arguments. The numbered elements of the Argument object and the parameter names are like two different names for the same variable. Changing the value of an argument with an argument name(这里是句子的主语) changes the value that is retrived through the arguments[] array.Conversely, changing the value of an argument through the arguments[] array(同上) changes the value that is retrived by the argument name.
下面是我认为的翻译文本:
数组对象包含一个非同寻常的特性,在非严格模式下,当一个函数包含若干形参时,实参对象里的数组元素就是这些与函数实参相对应的形参的别名。实参对象里以数字为索引的元素和函数形参就像同一个变量的两个不同名字。通过实参名字来改变实参的值,也会让通过arguments[]数组检索到的值随之发生改变。反过来,通过arguments[]数组来改变实参值,也会让通过实参名字检索到的值随之发生改变。
我感觉书上的翻译应该更适合一些大牛们,因为它更简洁,比如上面的最后一句话,太简洁,对原文做了很大的删减。但对于我这么纯粹的小白第一次看这些东西,实在是略困难。
对于原文的并且两字,我很难理解,因为我没由很好的发现并列关系,而英文原文的意思是实参对象里的数组元素和形参是同一个变量的两个不同名字。最后一句话的意思是,你修改了x的值,arguments[0]的值也会变,反过来,你修改了arguments[0]的值,x的值也会变。
原文中也表明了形参和实参的关系,the parameters that hold the function arguments, 这里我想不到除了对应外还可以用什么来解释hold这个词。
function f(x) { console.log(x); //返回x 的初始值 arguments[0] = null; // 修改x为null console.log(x); // null }
上面的x就是parameter, arguments[0]就是 arguments object(实参对象)的数组元素。修改一个,另一个值也会随之发生变化,反之亦然。
另一段书上翻译原文,(紧接着上面的那一段):
如果实参对象是一个普通数组的话,第二条console.log(x)语句的结果绝对不会是null,在这个例子中,arguments[0]和x指代同一个值,修改其中一个的值会影响到另一个。
英文原文:
This is emphatically not the behavior you would see if the Arguments object were an ordinary array. In that case, arguments[0] and x could refer initially to the same value, but a change to one would have no effect on the other.
我的翻译:
如果实参对象是一个普通数组的话,第二条console.log(x)语句的结果绝对不会是null。如果是那样的话(实参数组是普通数组),arguments[0] 和 x 开始都指代同一个值,但,改变一个的值不会对另一个的值产生影响。
这英文原文中,in that case 的意思是:如果是那样的话,在这里就是说,如果参数数组是普通数组的话,x 和 arguments[0]都指代相同的值,但是,(原文这里有一个but,表示转折)不会互相影响,因为这是普通数组的特性。而第一句话,译者翻译时对其进行了解释说明,让其意思更明了,很不错。
最后还是感谢译者的辛勤劳作,为我们翻译了这么了不起的一本书。但为了更好的学习js,将中英两版结合起来阅读也不失为一个好方法。
2015-12-23 14:40:48