[英]Losing scope on recursive call
我正在创建一个模块,该模块接受一个数据集和一个整数n,并一次用n个乘积递归地填充该数据集,在第一次调用之后,该函数失去了作用域,并出错了。 为什么,解决此问题的最佳实践是什么?
码:
function ProductFactory(){
var bigArr = [0,1,2,3,4,5,6,7,8,9];
var smallArr = [1,2,3,4];
return {
getProductList: getProductList,
getAllProducts: getAllProducts
};
function getProductList(start, size){ return start < 5 ? bigArr : smallArr }
function getAllProducts(batchSizeRequested, dataSet) {
var startPage = dataSet.length / batchSizeRequested;
var productBatch = this.getProductList(startPage, batchSizeRequested);
dataSet = dataSet.concat(productBatch);
if (productBatch.length === batchSizeRequested)
getAllProducts(batchSizeRequested, dataSet);
}
}
var productGetter = new ProductFactory();
productGetter.getAllProducts(10, []);
1)首先,您不应该使用this
调用getProductList
,在这种情况下,您可以直接调用它,因为getProductList
不是直接分配给该对象的函数。 这只是一个在代码中使用局部变量的闭包。 如果要使用this
调用函数,则应使用this
进行分配,例如this.getProductList = function() {}
2)除了冗余this
之外,我认为没有其他范围界定问题,但是我发现了另一个问题。 您实际上并没有从函数中返回任何内容,而且递归调用没有退出点。
固定代码如下所示。
function ProductFactory(){
var bigArr = [0,1,2,3,4,5,6,7,8,9];
var smallArr = [1,2,3,4];
return {
getProductList: getProductList,
getAllProducts: getAllProducts
};
function getProductList(start, size){ return start < 5 ? bigArr : smallArr }
function getAllProducts(batchSizeRequested, dataSet) {
var startPage = dataSet.length / batchSizeRequested;
var productBatch = getProductList(startPage, batchSizeRequested);
dataSet = dataSet.concat(productBatch);
if (productBatch.length === batchSizeRequested) {
return getAllProducts(batchSizeRequested, dataSet);
} else {
return dataSet;
}
}
}
var productGetter = ProductFactory();
var products = productGetter.getAllProducts(10, []);
console.log(products)
到函数调用这样的典型方法是向外部的值分配给this
(通常称为self
):
function ProductFactory(){
...
var self = this;
function getAllProducts(batchSizeRequested, dataSet) {
...
getAllProducts.apply(self, [batchSizeRequested, dataSet]);
}
}
但是,在这种情况下,请记住,您已经定义了一个闭包函数getAllProducts
,该函数只能在构造函数内部私有访问。 相反,您可能应该这样做:
function ProductFactory(){
...
var self = this;
this.getAllProducts = function(batchSizeRequested, dataSet) {
...
self.getAllProducts(batchSizeRequested, dataSet);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.