繁体   English   中英

递归调用失去作用域

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM