代码之家  ›  专栏  ›  技术社区  ›  Jose Rojas

脚本在浏览器中工作,但在nodejs中不工作

  •  1
  • Jose Rojas  · 技术社区  · 6 年前

    我在努力理解为什么这个脚本在浏览器中工作得很好,而不是在服务器的node.js中。

    data = [{"stars": 3}, {"stars": 2}]
    
    var ParseParameter = function(){
        this.parser = "";
    }
    
    ParseParameter.prototype = {
        setStrategy: function(parser) {
            this.parser = parser;
        },
     
        parse: function(parameter) {
            return this.parser.parse(parameter);
        }
    };
    
    
    var IntegerParser = function(filter){
    
        this.parameter = '';
        this.filter = filter;
    
        this.parse = function(parameter){
            this.parameter = parseInt(parameter); 
        }
    
        this.filterBy = function(item){
            return item[this.filter] == this.parameter;
        }
    }
    
    var filter = 'stars',
        parameter = '2',
        parseParameter = new ParseParameter();
    
    var integerParser = new IntegerParser(filter);
        parseParameter.setStrategy(integerParser);
        parseParameter.parse(parameter);
        
        var dataFiltered = data.filter(parseParameter.parser.filterBy);
    
        console.log(dataFiltered);

    在服务器上,我在控制台中打印 this.parameter this.filter 在功能上 filterBy 这些是 undefined

    我在node.js版本8.11.2上运行

    任何建议都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Farhan Tahir    6 年前

    可能是由于 this 脚本中的关键字。内部函数内部 window global 对象。例如,

    在下面的代码中, this.filter 属于 this.filterBy 不引用存在于范围内的筛选器属性 IntegerParser 相反,它引用的变量定义为 var filter = 'stars' . 把这个名字改成别的名字,你就会看到 undefined 而且它也不能在浏览器上工作。这就是你的问题所在。

    var IntegerParser = function(filter){
    
        this.parameter = '';
        this.filter = filter;
    
        this.parse = function(parameter){
            this.parameter = parseInt(parameter); 
        }
    
        this.filterBy = function(item){
            return item[this.filter] == this.parameter;
        }
    }
    

    而不是使用 您可以通过存储 到一个变量,供以后使用。如以下示例所示:

    var IntegerParser = function(filter){
    
            this.parameter = '';
            this.filter = filter;
            var self = this;  // store this to self and use self in inner functions
    
            this.parse = function(parameter){
                self.parameter = parseInt(parameter); 
            }
    
            this.filterBy = function(item){
                return item[self.filter] == self.parameter;
            }
        }
    

    包括我的解决方案在内的整个代码如下:

    data = [{"stars": 3}, {"stars": 2}]
    
    var ParseParameter = function(){
        this.parser = "";
    }
    
    ParseParameter.prototype = {
        setStrategy: function(parser) {
            this.parser = parser;
        },
     
        parse: function(parameter) {
            return this.parser.parse(parameter);
        }
    };
    
    
    var IntegerParser = function(filter){
    
        this.parameter = '';
        this.filter = filter;
        var self = this;
    
        this.parse = function(parameter){
            self.parameter = parseInt(parameter); 
        }
    
        this.filterBy = function(item){        
            return item[self.filter] == self.parameter;
        }
    }
    var filter = 'stars',
        parameter = '2',
        parseParameter = new ParseParameter();
    
    var integerParser = new IntegerParser(filter);
        parseParameter.setStrategy(integerParser);
        parseParameter.parse(parameter);
        
        var dataFiltered = data.filter(parseParameter.parser.filterBy);
    
        console.log(dataFiltered);

    它应该可以毫无问题地工作。请试试看它是否适合你。