克隆javascript函数,闭包范围

时间:2016-06-03 15:54:21

标签: javascript closures

我有这个关闭:

function CFetchNextData(ofs, pag, fetchFunction) {
  var offset = ofs;
  var limit = pag;

  return function(options, cb) {
    //do stuff to create params
    fetchFunction(params, cb);
    offset += limit;
  };
}

然后我以这种方式创建一个变量:

var fetchInfo = CFetchNextData(0, 10, specificFetchFunction);
fetchInfo(options, myCB);

因此,每次调用fetchInfo时,分页都会自动设置为下一组数据。尽管如此,这很有效 我想有多个实例:“fetchInfo”,每个实例都有自己的范围。

var A = fetchInfo; // I'd like a clone with its own scope, not a copy
var B = fetchInfo; // I'd like a clone with its own scope, not a copy

我能做到:

var A = new CFetchNextData(ofs, pag, fetchFunction);
var B = new CFetchNextData(ofs, pag, fetchFunction);

但显然我每次都必须设置“ofs”和“pag”,而通过克隆fetchInfo,我会有一个稳定的分页,只设置一次且永远。 你知道怎么做吗? 提前致谢

2 个答案:

答案 0 :(得分:2)

没有在JavaScript中克隆函数的概念。如果要创建多个闭包,则需要多次调用CFetchNextData(或其他函数)。

您可以让CFetchNextData返回工厂函数,而不是返回实际函数。但我不确定这是否真的有所改善。

function CFetchNextDataFactory(ofs, pag, fetchFunction) {
  return function() {
      var offset = ofs;
      var limit = pag;

      return function(options, cb) {
        //do stuff to create params
        fetchFunction(params, cb);
        offset += limit;
      };
  };
}

var fetchInfoFactory = CFetchNextData(0, 10, specificFetchFunction);
var A = fetchInfoFactory();
var B = fetchInfoFactory();

答案 1 :(得分:0)

这可能无法回答您的所有问题,但只是为了介入,您可以尝试将参数分配给默认/回退值,这样可以避免设置和设置每个声明。下面是我想出的原型。它使用oop:

class CFetchNextData {
    constructor(ofs, pag){
    this.OFS = 1; //default value
      this.PAG = 10; //default value
    this.ofs = ofs;
    this.pag = pag;

        if(ofs == null || ofs == undefined){

            this.ofs = this.OFS;

        }

    if(pag = null || pag == undefined){

            this.pag = this.PAG;

        }

    }
  fetchInfo(){     
      var data =  this.ofs += this.pag;
      return data;
    }

}


var task1 = new CFetchNextData(); // Falls back to default values..
var task2 = new CFetchNextData(32,31); // Uses values from specified in args...

document.write(task1.fetchInfo() + "\n")
document.write(task2.fetchInfo())

希望这会有所帮助......