克隆javascript函数,闭包范围

克隆javascript函数,闭包范围,javascript,closures,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 fetc

我有一个结论:

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,我将有一个稳定的分页,只设置一次,而且永远不会更改。 你知道如何做到这一点吗?
提前感谢

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

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

这可能无法回答您所有的问题,但为了深入了解,您可以尝试将参数指定给默认/回退值,这将允许您避免设置每个声明的S和pag。下面是我提出的一个原型。其使用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())

希望这对您有所帮助。

这可能无法回答您所有的问题,但您可以尝试将参数指定给默认值/回退值,这将允许您避免设置每个声明的S和pag。下面是我提出的一个原型。其使用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())

希望这有助于……

谢谢。工厂的设计正好达到我想要的。你为什么说这可能不是一个改进?谢谢。工厂的设计正好达到我想要的。你为什么说这可能不是一个改进?谢谢。这也可能是一个解决方案。我可以使用它,在每次调用时将specificFetchFunction传递给fetchInfo,或者在构造函数中使用this.fetchFunction=specificFetchFunction,如果通过fetchInfo调用,则调用。另一方面,使用es6类可以在构造函数参数列表中设置默认值:constructor(ofs=1,pag=10){…}。谢谢。这也可能是一个解决方案。我可以使用它,在每次调用时将specificFetchFunction传递给fetchInfo,或者在构造函数中使用this.fetchFunction=specificFetchFunction,如果通过fetchInfo调用,则调用。另一方面,使用es6类可以在构造函数参数列表中设置默认值:constructor(ofs=1,pag=10){…}。