脚本在浏览器中工作,但在 NodeJS 中不起作用



我正在努力理解为什么这个脚本在浏览器中完美运行,但在服务器中的 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);

在服务器上,我在控制台中打印函数filterBythis.parameterthis.filter的值,这些值undefined

我在 Node.js 版本 8.11.2 上运行

任何建议将不胜感激。

可能是由于脚本中this关键字的问题。在内部函数中thiswindowglobal对象。例如

在下面的代码中,this.filterBythis.filter不是指存在于函数作用域内的 filter 属性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;
}
}

您可以使用已知的解决方案来解决此问题,而不是使用this,方法是将this存储到变量以供以后使用。 如以下示例所示:

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

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

最新更新