修改大括号初始化对象

时间:2016-08-10 02:02:02

标签: javascript

行为问题:

为什么Ninja.getArrayFromInside()返回一个空数组? (在Ninja.array修改之后)

let Ninja = (function() {

  let array = [];

  function getArrayFromInside() {
    return array;
  }

  return {
    array, getArrayFromInside
  };

})();

Ninja.array = [1, 2];

console.log(Ninja.getArrayFromInside());

我认为,这是关于通过价值或参考传递...... (为什么数组按值传递,而不是按引用传递?)

同样的问题:

let Ninja = (function() {

  let myObject = {};
  myObject.array = [];

  function getArrayFromInside() {
    return myObject.array;
  }

  return {
    array: myObject.array,
    getArrayFromInside
  };

})();

Ninja.array = [1, 2];

console.log(Ninja.getArrayFromInside());

2 个答案:

答案 0 :(得分:3)

在第一个示例中,有两个名为array的变量:let array = [];函数捕获的内部作用域中声明为getArrayFromInside的变量,以及属性Ninja.array这是两个不同的变量。 array引用的第一个变量。您可以在this.array函数中getArrayFromInside引用的第二个。

将它们初始化为对同一数组对象(最初为空)的引用。然后,您指定Ninja.array来引用另一个对象:数组[1, 2]。这不会修改let array ...变量;因为函数获取let array的值,它返回原始的,仍为空的数组对象。

尝试将Ninja.array = [1, 2];更改为Ninja.array.push(1);Ninja.array.push(2);。您会看到像这样修改原始数组会导致更改反映在Ninja.getArrayFromInside()调用中。

答案 1 :(得分:0)

在第一个示例中,dict1 = [{'ledecky': 1, 'king': 2, 'vollmer': 3}, {'ledecky': 1, 'vollmer': 2, 'king': 3}, {'schmitt': 1, 'ledecky': 2, 'vollmer': 3}] medal_value = {1 : 10.0, 2 : 5.0, 3 : 3.0} print calculate_points(dict1, medal_value) >>> {'ledecky': 25.0, 'king': 8.0, 'schmitt': 10.0, 'vollmer': 11.0} 不是array的类成员。 Ninja会返回this.array

第二个例子相同。