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