我正在努力理解为什么这个脚本在浏览器中可以完美运行,但在服务器的 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
的值,这些是 未定义
我在 Node.js 版本 8.11.2 上运行
任何建议将不胜感激。
最佳答案
这可能是由于脚本中的 this
关键字的问题。在内部函数中,this
指的是 window
或 global
对象。例如,
在下面的代码中,this.filterBy
的 this.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);
它应该没有任何问题。请尝试看看它是否适合您。
关于javascript - 脚本在浏览器中工作,但在 NodeJS 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50560598/