【问题标题】:clone javascript function, closure scope克隆 javascript 函数,闭包范围
【发布时间】:2016-06-03 15:54:21
【问题描述】:

我有这个关闭:

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 closures


    【解决方案1】:

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

    【讨论】:

    • 谢谢。工厂设计正好达到了我想要的。为什么你会说它可能不是改进?
    【解决方案2】:

    这可能无法回答您的所有问题,但只是为了投入,您可以尝试将您的参数分配给默认/备用值,这将允许您避免设置 ofs 并分页每个声明。下面是我想出的原型。它使用 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 调用 if。附带说明一下,使用 es6 类允许您在构造函数参数列表中设置默认值:constructor(ofs = 1, pag = 10) {...}。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2016-03-07
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多