Javascript 脚本可以在浏览器中工作,但不能在NodeJ中工作
我正在努力理解为什么这个脚本在浏览器中可以完美工作,但在服务器的Node.js中却不能Javascript 脚本可以在浏览器中工作,但不能在NodeJ中工作,javascript,node.js,Javascript,Node.js,我正在努力理解为什么这个脚本在浏览器中可以完美工作,但在服务器的Node.js中却不能 data=[{“星”:3},{“星”:2}] var ParseParameter=函数(){ this.parser=“”; } ParseParameter.prototype={ setStrategy:函数(解析器){ this.parser=解析器; }, 解析:函数(参数){ 返回this.parser.parse(参数); } }; var IntegerParser=函数(过滤器){ thi
data=[{“星”:3},{“星”:2}]
var ParseParameter=函数(){
this.parser=“”;
}
ParseParameter.prototype={
setStrategy:函数(解析器){
this.parser=解析器;
},
解析:函数(参数){
返回this.parser.parse(参数);
}
};
var IntegerParser=函数(过滤器){
this.parameter='';
this.filter=过滤器;
this.parse=函数(参数){
this.parameter=parseInt(参数);
}
this.filterBy=函数(项){
返回项【this.filter】==此参数;
}
}
变量过滤器='stars',
参数='2',
parseParameter=新的parseParameter();
var integerParser=新的integerParser(过滤器);
parseParameter.setStrategy(integerParser);
parseParameter.parse(parameter);
var dataFiltered=data.filter(parseParameter.parser.filterBy);
console.log(数据过滤)代码>此问题可能是由于脚本中的此
关键字问题造成的。在内部函数中,此
指的是窗口
或全局
对象。比如说,
在下面的代码中,this.filterBy的this.filter
不是指存在于IntegerParser
函数范围内的filter属性,而是指定义为var filter='stars'
的变量。将此名称更改为其他名称,您将看到未定义
,并且它在浏览器上也不起作用。这就是你的问题所在
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=[{“星”:3},{“星”:2}]
var ParseParameter=函数(){
this.parser=“”;
}
ParseParameter.prototype={
setStrategy:函数(解析器){
this.parser=解析器;
},
解析:函数(参数){
返回this.parser.parse(参数);
}
};
var IntegerParser=函数(过滤器){
this.parameter='';
this.filter=过滤器;
var self=这个;
this.parse=函数(参数){
self.parameter=parseInt(参数);
}
this.filterBy=函数(项){
返回项【自过滤】==自参数;
}
}
变量过滤器='stars',
参数='2',
parseParameter=新的parseParameter();
var integerParser=新的integerParser(过滤器);
parseParameter.setStrategy(integerParser);
parseParameter.parse(parameter);
var dataFiltered=data.filter(parseParameter.parser.filterBy);
console.log(数据过滤)代码>这可能是因为Node.js中的包装器函数。此关键字在节点中有所不同。您可以使用高阶函数而不是OO。可以找到一个例子,为什么内部函数“parse”的“this”与“IntegerParser”相同,而“fiterBy”函数的“this”是全局对象?因为'this.parse'和'this.filterBy'都是内部函数。@Vishal Lia,这是因为我们正在为ParseParameter
的原型分配一个新对象。对于对象,this
指的是对象本身。如果我使用原型语法而不是this.filterBy
writeIntegerParse.prototype.filterBy
,该怎么办,如何附加上下文?@JoseRojas在这种情况下,您可以使用JavaScript的调用
或应用
或绑定
方法来指定此
关键字的上下文或引用。请在此处阅读更多信息: