浅复制与深复制中的传值与传址
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方面所作的努力。

为之漫笔(李松峰),本博客专注于Web前后端技术、移动平台开发技术、交互设计和技术翻译。声明一下,因为时常需要外出审稿,而且基本不带笔记本,所以有时可能会迟一点回复大家的留言。