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
实际上有什么变化?
答案 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的神秘面纱:
当传入一个基本类型变量(如字符串或数字)时,该值将按值传入。这意味着在函数中对该变量的任何更改都与函数外部发生的任何内容完全分开。