Javascript 将作用域传递给self-exec函数内的函数

Javascript 将作用域传递给self-exec函数内的函数,javascript,function,scope,Javascript,Function,Scope,这可能看起来像是一个初学者的问题,但我已经自学了关于JS的所有知识(感谢堆栈溢出!) 这是一个以复杂方式传递范围的问题。我有一种感觉,它必须使用apply或bind来解决,这让我很难集中精力 我有一个解析器类来处理许多类似CSV的大型文件。这些文件都包含不同的信息,需要进行不同的处理。为了演示,让我们将它们命名为foo.csv和bar.csv。这个例子过于简单,但它说明了我的问题 构造函数函数: function Parser() { this.csvFoo = './foo.csv';

这可能看起来像是一个初学者的问题,但我已经自学了关于JS的所有知识(感谢堆栈溢出!)

这是一个以复杂方式传递范围的问题。我有一种感觉,它必须使用apply或bind来解决,这让我很难集中精力

我有一个解析器类来处理许多类似CSV的大型文件。这些文件都包含不同的信息,需要进行不同的处理。为了演示,让我们将它们命名为foo.csv和bar.csv。这个例子过于简单,但它说明了我的问题

构造函数函数:

function Parser() {
    this.csvFoo = './foo.csv';
    this.csvBar = './bar.csv';
    this.parsedInfo = {
        foos: [],
        bars: []
    };
}
然后我有两个函数来处理两种类型的文件:

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.\u 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
回调过于复杂(没有理由这样做!),而且您(还?)实际上不需要回调
makeObj
-
parseFoo
是同步的。

还有一个吗?试试
,self.\u parseFoo.bind(self),
。同样,在
makeObj
中,您没有绑定到回调函数,而是绑定到
makeObj
返回的任何函数。很抱歉,如果这是一个令人厌烦的函数,那么在查找此类答案时,主要的问题是,当您不知道要查找什么时,搜索正确的术语有多么困难。你教了我一些东西,谢谢你!不无聊,只是普通。如果您想了解更多信息,请检查并查找有关
this
关键字工作原理的教程;我想这经常被误解。太好了!你想发布一个答案并获得分数,还是我应该完全删除这个问题以避免常见问题阻塞网站?太晚了,我只接受下面的答案,删除
self
是一个很好的观点,因为你不需要它。是的,就像我说的,这个例子太简单了,实际上,我在实函数中有一些异步的东西;)