Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 脚本可以在浏览器中工作,但不能在NodeJ中工作_Javascript_Node.js - Fatal编程技术网

Javascript 脚本可以在浏览器中工作,但不能在NodeJ中工作

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

我正在努力理解为什么这个脚本在浏览器中可以完美工作,但在服务器的Node.js中却不能

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
write
IntegerParse.prototype.filterBy
,该怎么办,如何附加上下文?@JoseRojas在这种情况下,您可以使用JavaScript的
调用
应用
绑定
方法来指定
关键字的上下文或引用。请在此处阅读更多信息: