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
实际发生了什么变化?
最佳答案
当您使用 "Martin"
调用函数 Hello
时,变量 name
的值声明为函数 Hello
被赋值为 "Martin"
。
当您返回将属性 name
设置为传递给函数的 name
值的对象时,将复制该字符串。现在 o.name
有自己的字符串,它与 Hello
函数中的变量 name
的值是分开的。对 name
的任何更改都不会影响现在在对象属性上设置的值。这可以证明如下:
var name = "Martin";
var o = {
name: name
};
name = "Marc";
console.log(o.name); // Martin
console.log(name); // Marc
这几乎解决了您的第一个问题,但您第一个问题的完整答案需要您第二个问题的答案。当您在 Hello
函数中声明 changeName
时,它会创建一个 closure它继承了变量 name
,这意味着只要 name
在别处使用(一个例子是在其他闭包中),对变量 name
的任何更改都会反射(reflect)出来).这很难在您的代码中看到,因为在 Hello
运行之后唯一使用 name
的地方是在 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
方法没有您想要的效果。
关于javascript - 将传递的参数作为对象返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250392/