var aCentaur = a horse with rider; // aCentaur 的全局定义
// JScript 代码为简洁起见有省略
function antiquities() // 在这个函数中声明了一个局部 aCentaur 变量
{ // JScript 代码为简洁起见有省略
var aCentaur = A centaur is probably a mounted Scythian warrior;
// JScript 代码为简洁起见有省略
aCentaur += misreported; that is ; // 添加到局部变量
// JScript 代码为简洁起见有省略}
// 函数结束var nothinginparticular = antiquities();
aCentaur += as seen from a distance by a naive innocent;
/*在函数内该变量的值为 A centaur is probably a mounted Scythian warriormisreported; that is 在函数外该变量的值为这句话的其余部分
a horse with rider as seen from a distance by a naive innocent*/ 很重要的一点是注意变量是否是在其所属范围的开始处声明的有时这会导致意想不到的情况tweak();var aNumber = ;function tweak() {
var newThing = ; // 显式声明 newThing 变量
// 本语句将未定义的变量赋给 newThing因为已有名为 aNumber 的局部变量
newThing = aNumber;
//下一条语句将值 赋给局部的 aNumberaNumber = ;
if (false) {
var aNumber; // 该语句永远不会执行
aNumber = ; // 该语句永远不会执行
} // 条件语句结束
} // 该函数定义结束
当 JScript 运行函数时首先查找所有的变量声明var someVariable;并以未定义的初始值创建变量如果变量被声明时有值var someVariable = something;那么该变量仍以未定义的值初始化并且只有在运行了声明行时才被声明值取代假如曾经被声明过
JScript 在运行代码前处理变量声明所以声明是位于一个条件块中还是其他某些结构中无关紧要JScript 找到所有的变量后立即运行函数中的代码如果变量是在函数中显式声明的?也就是说如果它出现于赋值表达式的左边但没有用 var 声明 ? 那么将把它创建为全局变量复制传递和比较数据在 JScript 中对数据的处理取决于该数据的类型
按值和按引用的比较
Numbers 和 Boolean 类型的值 (true 和 false) 是按值来复制传递和比较的当按值复制或传递时将在计算机内存中分配一块空间并将原值复制到其中然后即使更改原来的值也不会影响所复制的值(反过来也一样)因为这两个值是独立的实体对象数组以及函数是按引用来复制传递和比较的 当按地址复制或传递时实际是创建一个指向原始项的指针然后就像拷贝一样来使用该指针如果随后更改原始项则将同时更改原始项和复制项(反过来也一样)实际上只有一个实体复本并不是一个真正的复本而只是该数据的又一个引用当按引用比较时要想比较成功两个变量必须参照完全相同的实体例如两个不同的 Array 对象即使包含相同的元素也将比较为不相等要想比较成功其中一个变量必须为另一个的参考要想检查两个数组是否包含了相同的元素比较 toString() 方法的结果最后字符串是按引用复制和传递的但是是按值来比较的请注意假如有两个 String 对象(用 new String(something) 创建的)按引用比较它们但是如果其中一个或者两者都是字符串值的话按值比较它们注意 鑒于 ASCII和 ANSI 字符集的构造方法按序列顺序大写字母位于小写字母的前面例如 Zoo 小于 aardvark如果想执行不区分大小写的匹配可以对两个字符串调用 toUpperCase() 或 toLowerCase()传递参数给函数按值传递一个参数给函数就是制作该参数的一个独立复本即一个只存在于该函数内的复本即使按引用传递对象和数组时如果直接在函数中用新值覆盖原先的值在函数外并不反映新值只有在对象的属性或者数组的元素改变时在函数外才可以看出
例如(使用 IE 对象模式)
// 本代码段破坏(覆盖)其参数所以
// 调用代码中反映不出变化function Clobber(param){
// 破坏参数在调用代码中
// 看不到 param = new Object();
parammessage = This will not work;}
// 本段代码改变参数的属性
// 在调用代码中可看到属性改变
function Update(param){
// 改变对象的属性
// 可从调用代码中看到改变
parammessage = I was changed;}
// 创建一个对象并赋给一个属性
var obj = new Object();
objmessage = This is the original;
// 调用 Clobber并输出 objmessage注意它没有发生变化
Clobber(obj);
windowalert(objmessage); // 仍然显示 This is the original
// 调用 Update并输出 objmessage注意它已经被改变了
Update(obj);
windowalert(objmessage); // 显示 I was changed
检验数据
当按值进行检验时是比较两个截然不同的项以查看它们是否相等通常该比较是逐字节进行的当按引用进行检验时是看这两项是否是指向同一个原始项的指针如果是则比较结果是相等如果不是即使它们每个字节都包含完全一样的值比较结果也为不相等
按引用复制和传递字符串能节约内存但是由于在字符串被创建后不能进行更改因此可以按值进行比较这样可以检查两个字符串是否包含相同的内容即使它们是完全独立产生的
[] []