Javascript使对象文字在函数内部等于{},

时间:2018-04-18 22:43:00

标签: javascript object scope object-literal

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




请帮忙。我不知道如何理解这个问题。 感谢您提前帮助。

4 个答案:

答案 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不会全局影响变量(在函数范围之外),因为它创建了一个新的本地对象,其新引用仅限于函数

对于原始类型,它们将始终按值传递,因此对它们所做的任何更改只会影响进行更改的函数范围内的变量