Почему значение X в Iife Chage зависит от того, как мы к нему обращаемся? - PullRequest
0 голосов
/ 11 декабря 2018

У меня следующий код js.

var a = (function(){
    var x = 0;
    var y = function(){
        x++;
        console.log(x);
    }
    var z = function(){
        return x;
    }
    return {
        x, y, z
    }
})();

Здесь, когда я пытаюсь получить доступ к a.x в первый раз, это дает мне вывод 0 (который ожидается, так как x инициализируется как 0) Затем я увеличиваю значение x с помощью функции y.Но после увеличения значения x в два раза (или, возможно, более чем в 2 раза), когда я пытаюсь получить доступ к значению x, это все равно дает мне a.x=0.Я не могу понять, почему это происходит, поскольку я уже изменяю значение x с помощью функции y.Тогда почему это не меняется.

(Но когда я получаю доступ к значению x через какую-то функцию, это дает увеличенное значение. Почему это другое поведение. Если к той же переменной, к которой у меня есть прямой доступ, то это даст некоторый выводи когда то же самое значение переменной, которое я возвращаю через какую-то функцию, оно дает другое значение. Почему?)

var a = (function(){
  var x = 0;
  var y = function(){
	x++;
	console.log(x);
  }
  var z = function(){
	return x;
  }
  return {
	x, y, z
  }
})();

console.log(a.x);
a.y();
a.y();
console.log(a.x);
console.log(a.z());

I думаю, это из-за закрытия, но не уверен в этом.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Последняя строка:

   return { x, y, z };

такая же как:

  return { x: x, y: y, z: z };

Так что копирует локальные переменные в объект.Для функций или объектов, которые не имеют значения, поскольку они копируются по ссылке, примитивы, однако, копируются по значению, поэтому вы получаете две разные z, локальную переменную и свойство объекта.

0 голосов
/ 11 декабря 2018

Когда вы создаете объект и возвращаете его:

return {
  x, y, z
}

Свойство x в объекте получает копию локальной переменной x.Он никак не связан с локальной переменной, кроме этой, поэтому последующие изменения переменной в замыкании не отражаются в этом объекте.

Вы можете создать метод получения:

return {
  get x() { return x; },
  y, z
};

Это приведет к тому, что любой доступ к свойству "x" возвращенного объекта извлечет текущее значение x в замыкании.

...