【问题标题】:JS function not updating an objectJS函数不更新对象
【发布时间】:2015-09-02 04:03:45
【问题描述】:
我已经简化了一个我一直在处理的函数,但是当函数运行时,console.log 仍然等于 0。我做错了什么会导致对象不更新?
var x = { y: 0 };
var z = 5;
function addStrokesToScore(a, b) {
a += b;
}
addStrokesToScore(x.y, z);
console.log(x.y);
【问题讨论】:
标签:
javascript
function
object
【解决方案1】:
addStrokesToScore(x.y, z) 将x.y 和z 的值 传递到函数中,它不传递对属性/变量的引用。您不能更改函数内的属性/变量;没有返回链接。
这里的正常情况是返回新值:
function addStrokesToScore(a, b) {
return a + b;
}
x.y = addStrokesToScore(x.y, z);
或者,您可以传入对x 对象的引用,并使用该引用更新其y 属性:
function addStrokesToScore(obj, b) {
obj.y += b;
}
addStrokesToScore(x, z);
但一般来说,除非有充分的理由,否则您应该改用 return 选项。
【解决方案2】:
问题是您传递的是值而不是对象引用:
var x = {
y: 0
};
var z = 5;
function addStrokesToScore(o, b) { //note
o.y += b; //note
}
addStrokesToScore(x, z); //note
alert(x.y);
【解决方案3】:
您正在传递一个不可变的数字。您需要传递对整个对象的引用:
var x = { y: 0 };
var z = 5;
function addStrokesToScore(a, b) {
a.y += b;
}
addStrokesToScore(x, z);
console.log(x.y);
【解决方案4】:
没有地方更新 x.y,您只是将它传递给 fn 并在 fn 局部变量“a”中更新。
您可以添加x.y+=b;
或在函数中添加 return a 并将您的调用语句设为x.y=addStrokesToScore(x.y, z);
【解决方案5】:
通过传递 x.y 你传递的值是 0 而不是引用。使用这个-
var x = { y: 0 };
var z = 5;
function addStrokesToScore(a, b) {
a.y += b;
}
addStrokesToScore(x, z);
console.log(x.y);
http://jsfiddle.net/pgwkuaq5/