2013-07-06 47 views
2

我正在试图围绕这个'争论传递'的想法。在我读的一本书中,它指出参数只是通过值而不是参考来传递。在JavaScript中,这个参数是如何通过值传递而不是通过引用传递的?

function addTen(num) { 
    num + = 10; 
    return num; 
} 


var count = 20; 
var result = addTen(count); 
alert(count); // 20 - no change 
alert(result); // 30 

上面的例子很清楚,但下面的例子让我非常困惑。

当人传递给setName函数时,是不是镜像局部变量'obj' 并向下传递函数中的语句? 即人首先被设置为属性名称,然后将其分配给新的对象,并且最后为这个新创建的人物对象分配属性'Gregg'?

为什么你得到'尼古拉斯'!!!!

function setName(obj) { 
    obj.name = "Nicholas"; 
    obj = new Object(); 
    obj.name = "Greg"; 
}   

var person = new Object(); 
setName(person); 
alert(person.name); //" Nicholas" 
+0

请找你的答案在这里 - http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-参考或通过价值语言 – abipc

回答

2

将对象传递为参考副本。现在发生的事情在你的例子是下一个:

var person = new Object();  

function setName(obj) { // a local obj* is created, it contains a copy of the reference to the original person object 
    obj.name = "Nicholas"; // creates a new property to the original obj, since obj here has a reference to the original obj 
    obj = new Object(); // assigns a new object to the local obj, obj is not referring to the original obj anymore 
    obj.name = "Greg"; // creates a new property to the local obj 
} 

setName(person); 
alert(person.name); //" Nicholas" 

* = obj是包含,这是原来的obj一参一局部变量。当您以后更改本地变量时,它不会反映到原始对象。

2

您得到"Nicholas"恰恰是因为JavaScript永远不被“引用”。如果是这样,您可以从任何位置更新person变量。情况并非如此,因此函数中的new Object()不会改变外部变量person

但也不是变量引用对象本身,而是变量包含一种特殊类型的引用,可让您在不直接访问内存的情况下更新对象。

这就是为什么JavaScript总是“按价值”的原因,您永远不会得到对象的完整副本。你只是得到一个特别参考的副本。因此,您可以操纵通过引用副本传递的原始对象,但实际上无法通过引用来替换它。

0

通过引用传递装置这样的:

function a(obj) { 
    obj = 3; 
} 

var test = new Object(); 
a(test); 
console.log(test); //3, so I have lost the object forever 

I.E.即使变量分配对调用者也是可见的。

当然,如果目标函数修改传递给它然后对象这些修改 对象本身将是给呼叫者可见。

2

在JavaScript中,所有东西都是按值传递的。当你将任何东西作为参数传递时,JS会复制它并将其发送给函数。当Object传递时,JS将该对象的引用复制到另一个变量中,并将该复制的变量传递给该函数。现在,由于传递的变量仍然指向该对象,因此可以使用该变量来更改其属性。或[]符号。但是如果你使用new来定义一个新对象,那么该变量只是指向新的引用。

function setName(obj) { 
    obj.name = "Nicholas"; // obj pointing to person reference 
    obj = new Object(); // obj now pointing to another reference 
    obj.name = "Greg"; // you have changed the new reference not person reference 
}   

var person = new Object(); // person pointing to person reference 
setName(person); 
alert(person.name); //" Nicholas" 
+0

亲爱的上帝,谢谢你的解释和评论。当他们一起阅读时,IT MADE非常有意义! –

1

参数通过值传递,而对于对象则表示该值是对该对象的引用的副本。

这是同样的事情,当你做一个简单的赋值,因为,这也是通过值:

// a variable that contains a reference to an object: 
var person = new Object(); 
// another variable, that gets a reference to the same object: 
var people = person; 
// a function call with a reference to the object: 
setName(person); 

在功能方面,该参数是独立运行,用于发送参考变量的局部变量进入功能,但它引用相同的对象:

function setName(obj) { 
    // as the variable references the original object, it changes the object: 
    obj.name = "Nicholas"; 
    // now the variable gets a reference to a new object 
    obj = new Object(); 
    // the new object is changed 
    obj.name = "Greg"; 
} 
相关问题