Javascript 将传递的参数作为对象返回

Javascript 将传递的参数作为对象返回,javascript,Javascript,从上面的代码可以清楚地看出,changeName没有改变name属性 1.为什么 2.什么是changeName实际更改?您必须指定要使用“this”更改该对象的属性,否则“name”将只是一个局部变量 尝试: 正在更改局部变量name(参数),而不是返回的对象的属性。因为字符串是不可变的,所以执行以下操作时: function changeName(newName) { name = newName; } str和str2是不同的对象。如果修改str,str2将不受影响 您可以执行

从上面的代码可以清楚地看出,
changeName
没有改变
name
属性

1.为什么


2.什么是
changeName
实际更改?

您必须指定要使用“this”更改该对象的属性,否则“name”将只是一个局部变量

尝试:

正在更改局部变量
name
(参数),而不是返回的对象的属性。因为字符串是不可变的,所以执行以下操作时:

function changeName(newName) {
     name = newName;
}
str和str2是不同的对象。如果修改
str
str2
将不受影响

您可以执行以下操作:

var str = "str";
var str2 = str;

当您使用
“Martin”
调用函数
Hello
时,声明为函数
Hello
参数的变量
name
的值被指定为
“Martin”
的值

将属性
name
设置为
name
值的对象返回到函数中时,会复制字符串。现在
o.name
有了自己的字符串,它与
Hello
函数中变量
name
的值分开。对
name
的任何更改都不会影响现在在对象属性上设置的值。这可以通过以下方式证明:

function Hello(name) {

    function changeName(newName) {
       obj.name = newName;
    }

    var obj = {
      changeName: changeName,
      name: name
    };

    return obj;
}
这几乎解决了您的第一个问题,但第一个问题的完整答案需要第二个问题的答案。当您在
Hello
函数中声明
changeName
时,它会创建一个继承变量
name
,这意味着只要在其他地方使用
name
,对变量
name
的任何更改都会反映出来(一个例子是在其他闭包中)。这在您的代码中很难看到,因为在运行
Hello
之后使用
name
的唯一位置是
changeName
,但您可以在下面的示例中看到我的意思:

var name = "Martin";
var o = {
  name: name
};
name = "Marc";
console.log(o.name); // Martin
console.log(name); // Marc

这两个因素使得您的
changeName
方法不会产生您想要的效果。

在从
changeName()返回名称时,放置
关键字

function Hello(name) {
  function changeName(newName) {
    name = newName;
  }

  function seeName() {
    return name;
  }

  return {
    changeName: changeName,
    seeName: seeName,
    name: name
  };
}

var o = Hello("Martin");

console.log(o.name); // "Martin"

o.changeName("Marc");

console.log(o.name); // "Martin"

console.log(o.seeName()); // "Marc"

您正试图揭开神秘的面纱:

当传入一个基本类型变量(如字符串或数字)时,该值将按值传入。这意味着在函数中对该变量的任何更改都与函数外部发生的任何更改完全不同


你能正确调用
changeName
吗?我不是想“更正”代码,只是想理解它为什么会这样做。@dylan1994,你必须指定你想用“this”来更改该对象的属性,否则“name”将只是一个局部变量……请用更多信息进行编辑。“仅编码”和“尝试此”答案是错误的,因为它们不包含可搜索的内容,并且没有解释为什么有人应该“尝试此”。我们努力成为知识的源泉。
var name = "Martin";
var o = {
  name: name
};
name = "Marc";
console.log(o.name); // Martin
console.log(name); // Marc
function Hello(name) {
  function changeName(newName) {
    name = newName;
  }

  function seeName() {
    return name;
  }

  return {
    changeName: changeName,
    seeName: seeName,
    name: name
  };
}

var o = Hello("Martin");

console.log(o.name); // "Martin"

o.changeName("Marc");

console.log(o.name); // "Martin"

console.log(o.seeName()); // "Marc"
function Hello(name) {

    function changeName(newName) {
       this.name = newName;
   }

    return {
      changeName: changeName,
      name: name
    };
}

var o=Hello("Martin");

console.log(o.name);   // "Martin"

o.changeName("Marc");

console.log(o.name);