浅复制与深复制中的传值与传址
2008年12月24日 编程技术
这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。
一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,栈内存和堆内存分别用于保存不可变类型值和可变类型值。
什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:
var stringValue = “I’m immutable data structure, mean you can’t modify me!”;
var anotherStringValue = stringValue;
stringValue = “I have changed”;
此时,anotherStringValue中保存的值会不会也变成“I have changed”?不会。因为
var anotherStringValue = stringValue;
照stringValue中保存的字符串的原样,复制一个字符串(相应地,在内存中分配一块新空间),并将该字符串赋给anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即
stringValue = “I have changed”;
只会影响stringValue的值。但是,确切来讲,stringValue = “I have changed”;并不是修改stringValue,而是创建了一个新字符串(相应地,在内存中分配一块新空间),然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了(当然,垃圾所占用的内存会被回收)。 查看全文 »
Deamweaver CS4怎样支持不唐突的JavaScript
2008年12月24日 翻译
提起Deamweaver和JavaScript,就会让人情不自禁地想起MM_swapImage——早期在Deamweaver中实现鼠标翻转图(swapImage)的“经典”JavaScript函数名。而且,在Deamweaver创建的网页中,到处可见各种类似的JavaScript函数。
不过,Deamweaver也在不断进化。Adobe显然不想反对不唐突的JavaScript。Deamweaver CS4已经支持这种现代的JavaScript编程理念,它的改进围绕将JavaScript代码外部化(external)展开。
首先,Deamweaver CS4在每个HTML文件相关工具条中,会为引用的每个外部文件(包括JavaScript、CSS及第三方域文件)添加一个按钮。点击按钮即可编辑相应外部文件(当然,第三方域中的文件无法编辑)。
其次,在“实时视图”(Live View)中,Deamweaver CS4嵌入了Webkit——Safari和Chrome浏览器的引擎——窗口,通过点击上述按钮,即可切换到相应外部文件,不会打断当前的“实时视图”。打开外部文件后,用户所做修改也会立即呈现在“实时视图”中,不必先保存JavaScript文件。
再次,“实时视图”包含“实时代码”模式,在这种模式下查看HTML代码,能看到“经过计算的源代码”。换句话说,“实时代码”模式显示的是当前页面的DOM结构。用户在“实时视图”中与页面交互导致的DOM变化,都会反映在“实时代码”中。有点类似Firebug啊。此外,在“实时代码”模式下,还可以“冻结”JavaScript,以便检查当前状态下的DOM层次。
Deamweaver CS4提供的JavaScript编辑器具有语法检查和代码提示功能。语法检查会在用户输入代码的同时提供即时反馈,告知用户可能存在的语法问题。代码提示可以根据页面引用中的所有JavaScript文件,向用户提示相关函数和对象;这意味着,代码提示适用于所有JavaScript库。不过,代码提示不适用于远程文件,如果要使用代码提示,必须将文件保存在本地。
最后,Deamweaver CS4还新增了一个“外部化JavaScript”(Externalize JavaScript)命令。这个命令可以把嵌入script标签中的代码,转移到外部JavaScript文件中,然后再为HTML文件添加一个新script标签(以引用新外部文件)。此外,这个命令还支持清理嵌入的JavaScript处理程序,例如onclick属性。不过,生成的不唐突版本有赖于Adobe自己的Spry JavaScript框架。虽然没有为使用别家框架提供选择,但也体现了Deamweaver CS4在支持不唐突JavaScript方面所作的努力。
jQuery1.3.1b征求测试,预计3岁生日时发布
2008年12月23日 Web开发, 翻译
jQuery团队经过艰苦努力,已经为测试jQuery库的新版本作好准备。在jQuery1.3正式供开发使用之前,还需要大家帮忙揪出隐藏的任何bug。
jQuery1.31b的下载地址为:http://code.jquery.com/jquery-1.3b1.js
注意,不要使用缩减或压缩版,因为这两种版本不容易定位错误。
主要变化:
以下是jQuery1.3的主要变化,这些变化可能会导致原有代码出现问题:
- 选择符引擎:虽然有关选择符的代码已经全部重写,但考虑不周的地方在所难免。
- DOM操作(append/prepend/before/after):大部分代码也都重写了,包括一些执行嵌入script元素的逻辑。
- .offset():另一个经过重写的方法。
- 事件触发:事件被触发后会沿DOM向上冒泡——而这可能带来问题。
以上没有包含jQuery1.3的全部变化,感谢各位能将发现的任何问题反馈回来(计划在2009年1月14日——那是jQuery库3岁生日)。
提交反馈的方式如下:
- 在jQuery bug跟踪系统中提交bug(需要注册一个账号)。
- 请在提交的bug中附上简单的测试用例(或者提供测试用例的链接)。
- 注明您测试的是“jQuery1.31b”(以防与其他版本混淆)。
- 将测试用例的链接和bug报告通过电子邮件发送到jQuery Dev列表,以便开发团队注意到您反馈的问题。
提前感谢各位的帮助。对这个新版本,我们恨不得马上就把它交到大家手中。
John Resig : http://blog.jquery.com/2008/12/22/help-test-jquery-13-beta-1/
读《中文的常态与变态》
2008年12月23日 翻译, 译作支持
最近,重读了《中文的常态的变态》,余光忠先生在这篇文章里谈到了名词、连词、介词、副词、形容词、动词等西化之病,并告诫译者要知所防范,并希望能举一反三。
重读斯文,触动最大的是形容词那一节,因为该节正击中了我在翻译中的“要害”——形容词前置过多,后饰不足。余先生原文有言:
“形容词或修饰语(modifier)可以放在名词之前,谓之前饰,也可以跟在名词之后,谓之后饰。……”
“目前的白话文,不知何故,几乎一律前饰,似乎不懂后饰之道。例如……‘我见到一个长得像您兄弟的男人。’(I saw a man who looked like your brother)却很少人会说:‘我见到一个男人,长得像你兄弟。’如果句短,前饰也无所谓。如果句长,前饰就太生硬了。例如下面这句:‘我见到一个长得像你兄弟说话也有点像他的陌生男人。’就冗长得尾大不掉了。要是改为后饰,就自然得多:‘我见到一个陌生男人,长得像你兄弟,说话也有点像他。’……”
“后饰句可以一路加下去,虽长而不失自然,富于弹性。前饰句以名词压底,一长了,就显得累赘、紧张、不胜负担,所以前饰句是关闭句,后饰句是开放句。”
几句话,完全点到了我在英译汉过程中最常犯的错误。前些天还在与人讨论英文主词之后加N多从句也不显累赘,但翻译为中文却容易捉襟见肘的问题。现在看来,形容词后置,或者从句后置,不失为解决之道。
《Dojo权威指南》译者序
2008年12月19日 好书
Dojo: The Definitive Guide Powering Up Ajax Development Techniques 已经在本月16日交稿了。期待早日出版啊。
平心而论,与现有的JavaScript库或框架相比,Dojo的确很值得O’Reilly为它自己出一本权威指南。
从译者的Web开发经验来看,在使用JavaScript语言创建跨平台、跨浏览器的RWA(Rich Web Applications,富Web应用程序)项目时,选择Dojo作为前端开发框架基本上可以做到别无所求。因为,对于通常的JavaScript库和框架所能解决的问题——DOM操作、事件处理、样式修改、外部通信的标准化,Dojo的Base和Core同样也给出了全套解决方案。
当然,就Dojo工具箱的库和框架部分而言,数据抽象和模拟类与继承是另外两个主要的亮点。
除了对开发RIA项目的底层逻辑提供强大支持外, Dijit专门针对设计人员给出大量即装即用的“部件”。部件就是HTML、JavaScript、CSS和其他相关资源(如图片)的集合,也是一个Function对象。基于Dojo部件的用户界面还支持换肤功能。
Util是Dojo独有的,其中包含构建工具、单元测试框架和压缩工具。为优化、测试产品和提高RIA项目的性能提供了有效支持。
在翻译本书的过程中,为确保技术细节的准确,译者参考了Mastering Dojo(The Pragmatic Bookshelf)一书。而且,全书的术语基本上做到了前后统一。需要说明的是,书中将dojo命名空间之下的所有函数(function)统一译为方法。虽然翻译为函数也未尝不可,但译者在此有两点考虑:首先,从面向对象的角度讲,通过对象访问的函数应该叫方法;其次,Dojo跟其他的库和框架一样,都非常强调命名空间,翻译为方法有助于读者进一步明确这一思想。另外,书中在谈及易访问性(Accessibility)时,多次提到了“退化能力”。对此存疑的读者,可以参考译者网站中的相关讨论和介绍。
从翻译一本书的角度讲,序和前言部分一般是最难翻译的。用出版社编辑的话来说,这些部分往往也是重灾区、地雷阵。译者在翻译Dojo之父Alex Russell为此书作的序时,得到了李锟、郭晓刚、米全喜、贺师俊的帮助,特别是米全喜抽时间审阅了全篇译文,提出了9处问题。在此一并致谢!当然,还要感谢陈冀康编辑给了译者翻译本书的机会,感谢责任编辑(暂时不知名,请编辑老师自己补上)为编辑此书付出的精力和时间。
欢迎读者朋友登录译者网站或通过邮件(为防垃圾,见书)反馈本书翻译中存在的问题,或者提供勘误信息。
另,在本书中文版交稿时,Dojo1.2已经发布。译者翻译了“Dojo1.2发版说明”,有需要的读者可以参考。
译者2008年12月18日于北京昌平名佳花园


本博客专注于Web前后端技术和技术翻译。目前正在翻译《JavaScript高级程序设计(第2版)》。新浪微博(t.sina.com.cn/lisf),Twitter(@cncuckoo,仅仅用于跟踪国外牛人;我翻不了墙,无法接受各位朋友的follow,抱歉!)