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