我不明白这个范围是如何运作的。如果eg.i
仅在first
中进行了修改,那么second
的价值如何得到修改?
示例
var obj = {
first: function() {
var eg = {i: 0}; // eg equals 0 here
obj.second(eg);
obj.second(eg);
console.log(eg.i); // 2
},
second: function(eg) {
++eg.i;
}
};
如何在第一个函数中修改eg.i
?
答案 0 :(得分:4)
当对象传递给JS中的函数时,它们作为引用而不是值传递:http://snook.ca/archives/javascript/javascript_pass
答案 1 :(得分:4)
正如我对Ahmed Nuaman的回答所说的那样,说参数通过引用传递是不正确的。证明这是微不足道的:
function change (x) {
//"replace" x with a different object?
x = {
a : 4
};
}
var o = { a : 6 };
change(o);
console.log(o.a); //6
如果参数确实已通过引用传递,o.a
将为4
。但是,参数是通过引用值传递的 - 在这种情况下,值只是对象。
这就是为什么你观察到问题中出现的症状:当你直接修改参数时,传入的对象被改变了。
就好像你有一些冰淇淋,然后回到展台,要求额外的一勺香草。你仍然有同样的杯子,但有额外的东西。在上面的例子中使用这个类比,你要求一个新的香草冰淇淋:你仍然有旧的冰淇淋,并没有改变(好吧,它可能已经融化了一点)。在传递参考的情况下,你会倾倒现有的冰淇淋,并获得一个全新的冰淇淋。
作为最后一点:这不是关于js中的范围规则。如果eg
没有传递给second
函数,则它将无法使用。
答案 2 :(得分:2)
您将eg
作为参数传递给second
。您可能更容易看到是否重命名它:
second: function(x) {
++x.i;
}
它在第一个函数中被修改,因为你用第二个函数修改它。