Можно ли изменить переменные внутри замыкания в JavaScript? - PullRequest
3 голосов
/ 19 апреля 2019

Предположим, у меня есть следующее:

(function() {
  let myVar = 300;
  window.myFunc = function() {
    console.log(myVar);
  };
})();

Не изменяя приведенный выше код, можете ли вы придумать способ изменить переменную myVar?Я имею в виду со стороны, вы можете сделать что-то вроде:

window.myFunc.__closure__.myVar = 10;

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Нет, это невозможно, поскольку областью действия переменной является блок функции.

Единственный способ изменить что-то внутри замыкания - это через свойства в текущем лексическом контексте (в данном случае объект window).

(function() {
  this.myVar = this.myVar || 300;
  window.myFunc = function() {
    console.log(myVar);
  };
})();

myVar = "Ele";
myFunc();
1 голос
/ 19 апреля 2019

Вы можете определить глобальную функцию, которая изменяет переменную:

(function() {
  let myVar = 300;
  window.myFunc = function() {
    console.log(myVar);
  };
  window.setMyVar = value => {
    myVar = value;
  };
})();

myFunc();
setMyVar(10);
myFunc();

Или вы можете вернуть setMyVar:

const setMyVar = (function() {
  let myVar = 300;
  window.myFunc = function() {
    console.log(myVar);
  };
  return value => {
    myVar = value;
  };
})();

myFunc();
setMyVar(100);
myFunc();
0 голосов
/ 19 апреля 2019

Идея использования замыкания состоит в том, чтобы сделать переменную доступной только для определенной области. Если вы хотите изменить его вне этой области, почему бы не использовать класс?

например.

class myClass {
  constructor(var) { this._var = var }
  set var(arg) { this._var = arg }

  yourFunc() { console.log(this._var) }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...