【问题标题】:Passing value to a function argument [duplicate]将值传递给函数参数[重复]
【发布时间】:2016-10-07 12:30:36
【问题描述】:

我有一个设置新对象名称的代码。

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

var newPerson = new Object(); 
setName(newPerson); 
console.log(newPerson.name);

我想使用 person 对象的属性 'name' 的值。

我期望值​​是“Greg”,但我得到的是“Nicholas”。

这是我的理解:'human' 是一个指向 Object 的指针。当函数被调用时,会创建另一个指向同一个对象的指针,名称为 newPerson。

newPerson 对象的“name”属性将设置为“Nicholas”。然后,在函数的第二行创建另一个 newPerson 对象。因此,第一个实例应该被销毁。然后,这个新对象的“名称”属性将设置为“格雷格”。我哪里错了?

【问题讨论】:

    标签: javascript function arguments parameter-passing


    【解决方案1】:

    将具有对象值的变量视为这些对象的句柄

    var newPerson = new Object(); 
    

    您创建了一个新对象和一个名为 newPerson 的句柄。

    setName(newPerson);
    
    function setName(human) { 
    

    setName 被调用时,newPerson 被复制到human。所以现在你有两个指向同一个对象的句柄。碰巧它们都可以在函数内部访问,但这对讨论并不重要。

        human.name = "Nicholas";
    

    human 引用的对象有一个新名称。因为humannewPerson 仍然是同一个对象的句柄,所以newPerson.name 现在也发生了变化。

        human = new Object();
    

    现在手柄发散了。 newPerson 仍然是 Nicholas 的句柄,但 human 成为新对象的句柄。

        human.name = "Greg";
    

    这个新对象的名字是格雷格。这不会以任何方式影响 Nicholas。

    };
    
    console.log(newPerson.name);
    

    newPerson 仍然是 Nicholas 的句柄。

    【讨论】:

    • 哦,我现在明白了!谢谢! :)
    【解决方案2】:

    human 是函数的局部变量。

    人类 = 新对象();

    在这一行之后,您有局部变量 human 的新对象,但不是您发送给函数作为参数的那个变量

    这意味着您将参数按值发送给函数。

    例如在 C# 中,您可以使用 keywork ref 这将使功能按预期工作。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2012-11-13
      • 1970-01-01
      • 2018-01-13
      • 2016-10-09
      • 2015-11-10
      • 2015-06-06
      • 2013-07-09
      • 2011-12-22
      相关资源
      最近更新 更多