我有以下javascript代码:
var oLink = {
title: $link.attr('title') || '',
row: $link.attr('data-row') || '',
$modal: ''
}
我现在调用这样的函数:
oLink.$modal = accessModalOpen(oLink, content);
我是否需要返回oLink。$ modal或者我可以在accessModalOpen中设置它吗?换句话说,参数oLink在javascript中作为引用传递?
更新
为oLink声明添加了$ modal
答案 0 :(得分:3)
根据您当前的设置,您应该将其退回。 oLink
作为参考传递,因此您也可以在函数内部设置它,但之后您会改为:
accessModalOpen(oLink, content);
答案 1 :(得分:2)
“换句话说,参数oLink在javascript中作为参考传递?”
是。在你的函数中,你将引用同一个对象,而不是对象的副本,所以是的,你可以在你的函数中更新,添加和删除对象属性。
请注意,在某些语言拥有它的意义上,它不是“通过引用传递”。函数外部的变量和函数内部使用的参数都将引用同一个对象,这就是为什么可以更改其属性,但是如果将函数参数分配给不影响函数外部变量的其他对象这将继续引用原始对象。
答案 2 :(得分:1)
在这种特定情况下,两者都将获得相同的结果 ,但它取决于oLink.$modal
属性的实际语义。如果该属性与accessModalOpen
的逻辑紧密相关,那么您应该在 accessModalOpen
内设置;如果有accessModalOpen
不应设置oLink.$modal
的情况,但您仍然需要以其他方式使用该值,则应将其返回。
答案 3 :(得分:1)
你可以这样做:
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);
答案 4 :(得分: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 }
因此,如果您将对象或函数传递给函数,则可以添加/修改属性 如果您传递一个数组,您将能够将项目推入其中,或者弹出项目。
如果要传递字符串或数字或布尔值,则需要使用返回值 (但是如果传递一个对象,则可以将其中一个属性修改为标量值。)
答案 5 :(得分:0)
与所有JavaScript参数一样,oLink将按值传递给函数 accessModalOpen 。但是,oLink本身只是对全局堆中存储oLink对象内容的位置的引用。这意味着您可以在函数中修改oLink上的属性,并且在函数返回后这些修改将继续可见。
如果要将oLink重新分配给 accessModalOpen 中的新对象,则在返回该函数后该更改将不可见。这意味着如果未分配,则无法创建新的oLink对象。
简短的回答是您可以在功能中修改oLink,就像您要求的那样。但请注意,如果您执行任何更改oLink引用的对象的操作,则在函数返回后(在外部范围内)将丢弃这些更改。如果你不理解它,这可能导致一些难以追踪的错误。
有一个非常好的写作,我将在下面链接JavaScript如何处理参数传递,我强烈推荐。它详细介绍了正在发生的事情。