如何将函数传递给稍后修改所述类

时间:2017-09-16 18:50:47

标签: javascript ecmascript-6

我正在尝试创建一个由构造时设置的函数修改的类。 问题是,如何让这个函数修改它所分配的类的私有字段。 我创建了一个简化的代码来解释:

https://jsfiddle.net/9zjc0k9e/(代码如下):

要修改的类:

foo = function(options) {
  let {func} = options; //The function we send on construction
  let a = []; //The variable we are trying to modify with the function

  function executer(v) {
    func(v);
  }

  return {executer};
};

主:

//The function we will send when constructing:
let funk = function(v) {
   a.push(v); // <- this 'a' is the private member of the class we wanna modify
}

//Construct:
let bar = new foo({
  func: funk
});

//Run the function we sent through the public class function assigned to that
bar.executer(1); //<-- Uncaught ReferenceError: a is not defined

我得到的错误是:Uncaught ReferenceError: a is not defined。 我希望我已经彻底解决了这个问题,有没有办法完成这个? Hack-ish是可以接受的。

1 个答案:

答案 0 :(得分:1)

外部函数无法在不传递的情况下查看局部变量a。该函数尝试在定义它的位置查找变量,意味着外部funk无法隐式访问foo的任何变量。如果a是一个对象变量,您可以通过上下文绑定访问它。

您还需要将a的引用传递给函数。

let funk = function(v, array) {
   array.push(v); 
}

通过

致电
function executer(v) {
    func(v, a);
}

您的代码

&#13;
&#13;
foo = function(options) {
  let {func} = options; 
  let a = []; 

  function executer(v) {
    func(v, a);
  }

  return {executer};
};


let funk = function(v, array){
   array.push(v);
}

let bar = new foo({
  func: funk
});

bar.executer(1);
&#13;
&#13;
&#13;