是否可以在JavaScript的闭包内部更改变量?

时间:2019-04-18 23:52:57

标签: javascript closures

假设我有以下内容:

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

在不更改上述代码的情况下,您能想到一种更改myVar变量的方法吗?我的意思是从外面说,你能做些什么吗?

window.myFunc.__closure__.myVar = 10;

这可能吗?

3 个答案:

答案 0 :(得分:2)

否,不可能,因为变量的范围是函数的块。

修改闭包内部内容的唯一方法是通过当前词法上下文中的属性(在这种情况下为window对象)。

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

myVar = "Ele";
myFunc();

答案 1 :(得分:1)

您可以定义一个全局函数来更改变量:

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

答案 2 :(得分:0)

使用闭包的想法是使变量只能在特定范围内访问。如果要在此范围之外进行更改,为什么不使用类呢?

例如

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

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