0

我有以下 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

4

6 回答 6

3

使用您当前的设置,您应该返回它。oLink 作为引用传递,所以你也可以在函数内部设置它,但是你会得到这个:

accessModalOpen(oLink, content);

Demo帮助你理解

于 2012-09-20T05:58:36.387 回答
2

“换句话说,参数oLink是作为javascript中的引用传递的吗?”

是的。在您的函数中,您将拥有对同一对象的引用,而不是对象的副本,因此您可以在函数中更新、添加和删除对象属性。

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

于 2012-09-20T06:25:09.897 回答
1

在这种特定情况下,两者都将获得相同的结果,但这取决于oLink.$modal属性的实际语义。如果该属性与 的逻辑密切相关accessModalOpen,那么您应该将其设置在内部 accessModalOpen;如果存在accessModalOpen 不应该设置的情况oLink.$modal,但您仍然需要以其他方式使用该值,则应该返回它。

于 2012-09-20T06:05:52.377 回答
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); 
​
于 2012-09-20T06:11:19.460 回答
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 }

因此,如果您将对象或函数传递给函数,您将能够添加/修改属性。
如果您传递一个数组,您将能够将项目推入其中,或从中弹出项目。

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

于 2012-09-20T06:20:21.203 回答
0

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

如果您要将oLink重新分配给 accessModalOpen 中的新对象,则该更改在函数返回后将不可见。这意味着如果未分配,您将无法执行创建新 oLink 对象之类的操作。

简短的回答是,您可以在函数内修改 oLink,就像您要求的那样。但请注意,如果您对 oLink 引用的对象进行了任何更改,那么这些更改将在函数返回后(在外部范围内)被丢弃。如果您不理解它,这可能会导致一些难以跟踪的错误。

有一篇非常好的文章,我将在下面链接我强烈推荐的 JavaScript 如何处理参数传递。它更详细地说明了正在发生的事情。

JavaScript 参数传递

于 2015-09-16T22:08:21.483 回答