Можно ли изменить переменные внутри замыкания в JavaScript?

#javascript #closures

#javascript #закрытие

Вопрос:

Давайте предположим, что у меня есть следующее:

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

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

 window.myFunc.__closure__.myVar = 10;
 

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

Комментарии:

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

2. через Dev-tools; просто установите точку останова в любой функции, которая может видеть эту переменную. с помощью кода, нет, невозможно, не изменив код; если только они не используют evil() где-то, где эта переменная видна, и вы можете ввести какой-то код.

Ответ №1:

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

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

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

myVar = "Ele";
myFunc(); 

Ответ №2:

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

 (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(); 

Комментарии:

1. @Ele Да, мне следовало потратить немного больше времени, чтобы прочитать вопрос, прежде чем отвечать.

Ответ №3:

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

например.

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

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