首页 > 解决方案 > JavaScript工厂函数修改闭包范围外的变量

问题描述

为什么变量“OnDone”在工厂范围内保持不变?

const foo = () => {
  let OnDone = null;

  const Do = function() {
    console.log(OnDone);
    if (typeof OnDone === 'function')
      OnDone();
  }

  return {
    Do,
    OnDone
  };
}


let f = foo();
f.OnDone = () => {
  console.log('OnDone');
};

f.Do();

输出空。 https://jsfiddle.net/xe4j9hmc/6/

标签: javascriptclosures

解决方案


let onDone = nullonDone在函数范围内定义一个变量foo不是属性,但是当你这样做时

f.onDone它为可以访问的onDone属性 增加了价值,但在您使用的代码中仍然指的是在本地范围内定义的fthis.onDoneonDoneonDone


你可能想这样做

function foo(){
  this.OnDone = null;

  const Do = function() {
  console.log(this.OnDone);
  if (typeof this.OnDone === 'function')
    this.OnDone();
  }

  return {Do, onDone:this.OnDone};
}


let f = new foo();
f.OnDone = () => {
  console.log('OnDone');
};

f.Do();


推荐阅读