举一个例子:
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
FunctionArgumentsExample02.htm
以上代码中创建一个对象,并将其保存在了变量 person 中。然后,这个变量被传递到 setName()
函数中之后就被复制给了 obj 。在这个函数内部, obj 和 person 引用的是同一个对象。**换句话说,即
使这个变量是按值传递的, obj 也会按引用来访问同一个对象。---问题1:这里说的按值传递,这个值是指什么?**于是,当在函数内部为 obj 添加 name
属性后,函数外部的 person 也将有所反映;因为 person 指向的对象在堆内存中只有一个,而且是全
局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明
参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:
这个例子与前一个例子的唯一区别,就是在 setName() 函数中添加了两行代码:一行代码为 obj
重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的 name 属性。**在把 person 传递给
setName() 后,其 name 属性被设置为 "Nicholas" 。---问题二:属性被修改后能在函数外部读取到,不就是引用类型嘛?后面的解释理解不了**然后,又将一个新对象赋给变量 obj ,同时将其 name
属性设置为 "Greg" 。如果 person 是按引用传递的,那么 person 就会自动被修改为指向其 name 属性值
为 "Greg" 的新对象。但是,当接下来再访问 person.name 时,显示的值仍然是 "Nicholas" 。这说明
即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写 obj 时,这
个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
Cats萌萌
素胚勾勒不出你
相关分类