2012-09-20 41 views
0

我有以下的javascript代码:对象参数是否作为Javascript中的引用传递给函数?

var oLink = { 
     title: $link.attr('title') || '', 
     row:  $link.attr('data-row') || '', 
     $modal: '' 
    } 

我现在请这样的功能:

oLink.$modal = accessModalOpen(oLink, content); 

我需要回到OLINK $模式或可我只是把它里面accessModalOpen?换句话说,参数oLink是作为javascript中的参考传递的?

更新:

新增$模式到OLINK声明

+0

你可以通过尝试两种不同的情况简单地发现你自己。 – saji89

+0

尽管“如果有效”,我希望得到一些建议,这是一件好事。谢谢 –

回答

2

“换句话说,参数oLink在javascript中作为参考传递?”

是的。在你的函数中,你将有一个对同一个对象的引用,而不是对象的副本,所以你可以在你的函数中更新,添加和删除对象属性。

请注意,它不是“通过引用”,因为某些语言具有它。函数外部的变量和函数内使用的参数都会引用同一个对象,这就是为什么您可以更改其属性,但是如果将函数参数分配给某个不影响函数外部变量的其他对象这将继续引用原始对象。

3

根据您当前的设置,您应该归还。 oLink作为引用传递,这样你就可以设置它的功能太里面,但你已经有了这个来代替:

accessModalOpen(oLink, content); 

Demo to help you understand

+0

你能解释为什么你认为我应该回报它吗?我稍微更新了我的问题,并将$ modal包含在oLink声明中。谢谢 –

+0

那么,在你目前的设置中,如果你没有返回它,最后'oLink. $ modal'将会是未定义的。它将在函数内部设置,然后函数结束,它不会返回任何内容,它是'未定义的',并且这个返回值将被设置为变量,使其成为'未定义的'。 –

1

双方将在此得到相同的结果具体情况为,但它取决于oLink.$modal属性的实际语义。如果该属性与accessModalOpen的逻辑密切相关,那么您应该在accessModalOpen内设置它;如果出现accessModalOpen不应该设置oLink.$modal的情况,但您仍然需要以其他方式指定该值,则应返回该值。

1

您可以执行:

DEMO

var $link = { 
    attr:function(str) { return str; } 
} 

function accessModalOpen(obj,cont) { 
    return "Modal: accessed "+obj.title+" with "+cont.text; 
}  
function accessModalOpen1(obj,cont) { 
    obj.$modal1= "Modal1: accessed "+obj.title+" with "+cont.text; 
}  
var content = { 
    text:"This is content" 
}  
var oLink = { 
    title: $link.attr('object title') || '', 
    row:  $link.attr('data-row') || '' 
} 

oLink.$modal = accessModalOpen(oLink, content); // return content and set 
alert(oLink.$modal); 

accessModalOpen1(oLink, content); // just set 
alert(oLink.$modal1); 
​ 
+0

你可以在'accessModalOpen'中看到'return'吗?这就是他正在谈论的。他问他是否可以简单地将值设置在那里,而不是“返回”值。 –

+0

啊 - 现在我明白了。更新以反映任一 – mplungjan

1

为了帮助(或阻碍......我们将看到),JS经过引用非标量的对象,但经过价值标对象。

var x = 10; 
function increment (num) { num += 1; } 

increment(x); 
console.log(x); // 10; 

同时:

var bob = { 
    name : "Bob", 
    age : 32, 
    job : "Shoe Salesman", 
    salary : 2000000 
}; 

function fire (employee) { 
    delete employee.job; 
    employee.unemployed = true; 
    employee.salary = 0; 
} 

fire(bob); // { name : "Bob", age : 32, unemployed : true, salary : 0 } 

所以,如果你传递一个对象或一个函数变成一个功能,您将能够添加/修改属性。
如果你传递一个数组,你将能够将物品推入其中,或弹出物品。

如果传递字符串或数字或布尔值,则需要使用返回值 (但如果传递一个对象,则可以将其某个属性修改为标量值)。

0

与所有JavaScript参数一样,oLink将通过值传递给函数accessModalOpen。然而,oLink本身只是对全局堆中存储oLink对象内容的位置的引用。这意味着您可以从函数内修改oLink上的属性,并且在函数返回后,这些修改将继续可见。

如果您要将oLink重新分配给accessModalOpen中的新对象,那么在该函数返回后该更改将不可见。这意味着你不能做一些事情,如创建一个新的oLink对象,如果它未被分配。

简短的回答是,您可以修改函数中的oLink,就像您在问。但请注意,如果您执行的任何操作都会更改oLink所引用的对象,那么在该函数返回后(在外部作用域中),这些更改将被丢弃。如果你不理解它,这可能会导致一些难以跟踪的错误。

有一个非常好的写法,我将在下面链接如何JavaScript处理参数传递,我强烈建议。它详细介绍了发生的事情。

JavaScript parameter passing

相关问题