How to understand this output?
为什么data.value仍然等于'值'?
function funcA(data) {
data.key = 'data';
}
function funcB(data) {
data = {};
data.value = 'data';
}
var data = {
key: 'key',
value: 'value'
};
funcA(data);
funcB(data);
console.log(data.key); //data
console.log(data.value); //value

请帮忙。我不知道如何理解这个问题。 感谢您提前帮助。
答案 0 :(得分:3)
您必须了解如何在JavaScript函数中传递对象。它是对存储器中传递的对象的引用。在data = {}
中执行funcB
后,函数 {em> data
的本地副本现在指向一个新的空对象,而不是原始对象在函数外部定义的data
的位置。然后,行data.value = 'data'
只是修改了本地的空对象,而不是原始对象。
答案 1 :(得分:1)
这个data = {};
只更新本地参数,而不是原始变量。
如果JS是"通过引用" 语言传递,那就行了,但它不是。您正在传递"引用类型" ,但是正在传递"值" ,所以只有值(对象的引用)更新为新实例。
答案 2 :(得分:0)
参数按值传递,但参数的名称与值不同。在你的funcB()
中,你会发生一些令人困惑的事情,因为名字都是一样的。
function funcB(data) {
// the **name** `data` is not the same as the data you declared earlier
// even though they both point to the same object
// this inner data shadows the outer data
data = {};
// now you set the inner `data` name to point to a new object and you have two datas
// one outside that you set with var data and this one. Since you can only have one
// data name in the scope the inner one wins.
data.value = 'data';
// changing data here only changes the inner one.
}
如果您使用不同的名称,则更容易看到:
function funcB(inner_data) {
// the name inner_data and data both point to the same object
console.log(inner_data === data)
// now inner_data points to something else
inner_data = {};
inner_data.value = 'data';
}
var data = {
key: 'key',
value: 'value'
};
funcB(data);
console.log(data.key); //data
console.log(data.value); //value

发生混淆是因为如果你没有为你的论点data
命名,你仍然可以从函数中访问外部data
。例如:
function funcB(inner_data) {
// the name inner_data and data both point to the same object
console.log(inner_data === data)
// but since you're not shadowing the outer data with
// a new name in this scope you can still reach outer data
data = {};
data.value = 'data';
}
var data = {
key: 'key',
value: 'value'
};
funcB(data);
console.log(data.key); //data
console.log(data.value); //value

答案 3 :(得分:0)
首先你应该已经知道,当你将一个对象分配给一个变量时,这个变量将在内存中保存对该对象数据的引用
引用只是一个内存位置,以便我们知道对象数据的存储位置
js有一个名为Call by sharing的东西,我遇到了麻烦,但经过一番搜索,我的结论是:
如果你只是在函数作用域内改变了对象的属性,它将全局影响变量(在函数作用域之外)因为你改变了这个变量所引用的对象的值而不是引用本身,就像你的funcA
一样除非你为这个变量重新分配一个新对象,在这种情况下,你正在改变你的变量引用的位置,它现在引用其他东西,所以你在函数内做的任何改变都将不影响函数外部的变量值,funcB不会全局影响变量(在函数范围之外),因为它创建了一个新的本地对象,其新引用仅限于函数
对于原始类型,它们将始终按值传递,因此对它们所做的任何更改只会影响进行更改的函数范围内的变量