克隆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){…}。