javascript - 脚本在浏览器中工作,但在 NodeJS 中不工作

标签 javascript node.js

我正在努力理解为什么这个脚本在浏览器中可以完美运行,但在服务器的 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.parameterthis.filter 函数 filterBy 的值,这些是 未定义

我在 Node.js 版本 8.11.2 上运行

任何建议将不胜感激。

最佳答案

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

在下面的代码中,this.filterBythis.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/

相关文章:

javascript - 在 React 上设置默认 ref 值?

javascript - P-521(Web Crypto Api)/secp521r1(NodeJS Crypto)的 ECDH 生成略有不同的共享 key

node.js - Google Sheet API,需要但未指定 'valueInputOption'

javascript - $.getScript 不工作 (IE8)

javascript - 在 Javascript 中让一个函数与另一个函数配合

php - 无需重新加载页面的聊天客户端/帖子

javascript - Angular2 的简单运行会引发 es6-promise .Promise 错误

javascript - 顶级 reducer 中的 redux 状态选择器

node.js - Amazon Ec2 服务器上的数据库连接丢失

javascript - 导入文件而不实际导入它