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

时间:2015-08-27 13:13:49

标签: javascript

function Hello(name) {

    function changeName(newName) {
       name = newName;
   }

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

var o=Hello("Martin");

o.name;   // "Martin"

o.changeName("Marc");

o.name;   // "Martin"

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

1.为什么?

2. changeName实际上有什么变化?

5 个答案:

答案 0 :(得分:1)

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

尝试:

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

答案 1 :(得分:1)

function changeName(newName) {
     name = newName;
}

正在更改局部变量name(参数),而不是返回的对象的属性。因为string是不可变的,所以:

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

str和str2是不同的对象。如果您修改str,则str2不会受到影响。

您可以执行以下操作:

function Hello(name) {

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

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

    return obj;
}

答案 2 :(得分:1)

当您使用Hello调用函数"Martin"时,声明为函数name的参数的变量Hello的值被赋值为{{1 }}

当您返回将属性"Martin"设置为传递给函数的name值的对象时,将复制该字符串。现在name有自己的字符串,它与o.name函数中变量name的值分开。对Hello的任何更改都不会影响现在在对象属性上设置的值。这可以证明如下:

name

这几乎解决了您的第一个问题,但对第一个问题的完整答案需要您回答第二个问题。当您在var name = "Martin"; var o = { name: name }; name = "Marc"; console.log(o.name); // Martin console.log(name); // Marc 函数中声明changeName时,它会创建一个继承变量Hello的{​​{3}},这意味着每当变量name发生任何变化时都会反映出来name在别处使用(一个例子在其他闭包中)。这很难在您的代码中看到,因为在name运行后name运行Hello的唯一位置是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方法无法满足您的效果。

答案 3 :(得分:0)

this方法返回名称时输入changeName()关键字。

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);

答案 4 :(得分:0)

你正试图揭开PASSING BY VALUE OR BY REFERENCE的神秘面纱:

  

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