将作用域传递给自执行函数中的函数

Passing scope to function inside self-exec function

本文关键字:函数 执行 作用域      更新时间:2023-09-26

这似乎是一个初学者的问题,但我已经自学了我所知道的关于JS的所有知识(感谢Stack Overflow!

这是一个以复杂方式传递范围的问题。我有一种感觉,它必须使用应用或绑定来解决,我很难理解。

有一个解析器类来处理我拥有的许多大型类似CSV的文件。这些文件都包含不同的信息,需要以不同的方式处理。为了演示,我们称它们为 foo.csv 和 bar.csv。这个例子过于简单,但它展示了我遇到的问题。

构造函数:

function Parser() {
    this.csvFoo = './foo.csv';
    this.csvBar = './bar.csv';
    this.parsedInfo = {
        foos: [],
        bars: []
    };
}

然后我有 2 个函数来处理 2 种类型的文件:

Parser.prototype._parseFoo = function(line, cb) {
    var fields = this._parseLine(line,',');
    this.parsedInfo.foos.push({
        foo1: fields[1],
        foo2: fields[2]
    });
    cb();
};
Parser.prototype._parseBar = function(line, cb) {
    var fields = this._parseLine(line,',');
    this.parsedInfo.bars.push({
        bar1: fields[1],
        bar2: fields[2]
    });
    cb();
};

还有一个根据分隔符分割线的函数:

Parser.prototype._parseLine = function(line, delim) {
    return (line.split(delim));
};

流式传输文件并执行解析的函数如下:

Parser.prototype._streamParseFile = function(file, makeObj, cb) {
    var self = this;
    var lineNum = 0;
    var s = fs.createReadStream(file).pipe(es.split()).pipe(es.mapSync(function(line) {
        s.pause();
        (function() {
            makeObj(line, function(sale) {
                s.resume();
            });
        })();
    }).on('error', function(err) {
        console.log('Error');
        console.log(err);
    }).on('end', function() {
        console.log('done');
        cb();
    }));
};

我这样称呼它:

Parser.prototype.insertFoos = function() {
    var self = this;
    self._streamParseFile(self.csvFoo,self._parseFoo,function() {
        console.log('Done Foo');
    });
};

我遇到的问题是,当它到达_parseFoo时,"this"对象设置不正确,因此在这种情况下我无法使用 this._parseLine()。

我以为我可以侥幸使用:

makeObj(line, function(sale) {
    s.resume();
}).bind(self);

但它不起作用。我目前正在阅读文档和文章,但我知道这是一个我不掌握的领域,所以一个解释会有很大帮助。

你会想做的

Parser.prototype.insertFoos = function() {
    this._streamParseFile(this.csvFoo, this._parseFoo.bind(this), function() {
//                                                   ^^^^^^^^^^^
        console.log('Done Foo');
    });
};

请注意,您的es.mapSync回调过于复杂(没有理由使用IEFE!),并且您(还?)实际上不需要makeObj回调 - parseFoo是同步的。