为什么我不能消除这个箭头功能?
Why can't I eliminate this arrow function?
我确信以下两个陈述归结为同一件事。
但是在将第一个语句重构为第二个语句后,我破坏了我的应用程序。
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', (data) => myReader.processData(data));
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', myReader.processData);
为什么这两个不是一回事?
这些箭头函数中没有this
,所以看起来无害。至于 DataReader class 本身:
type DataReaderCallback = (msg: string) => any
export class DataReader {
private _buffer = "";
constructor(private listener: DataReaderCallback = null) {
}
processData(data) {
// remove carriage returns.
data = data.toString().replace(/\r/g, '');
this._buffer += data;
// get only the complete data.
const lastNewlineIndex = this._buffer.lastIndexOf('\n');
if (lastNewlineIndex < 0) return;
if (this.listener != null) {
// split data in lines
const completeData = this._buffer.slice(0, lastNewlineIndex);
const lines = completeData.split('\n');
for (const line of lines) {
// notify listener line by line.
this.listener(line);
}
}
// remove processed data from the buffer.
this._buffer = this._buffer.slice(lastNewlineIndex + 1);
}
}
As for the DataReader class itself…
它确实使用this
,例如this._buffer += data;
所以需要调用processData
的代码需要确保myReader
是它的this
值
箭头函数通过将其称为 myReader.processData(data)
.
来实现这一点
如果您将 processData
函数作为参数传递给 on
,那么事件处理代码 不会 在 [= 的上下文中调用它14=]。它甚至不知道 myReader
存在。
如果你想移除箭头函数,那么你必须做一些其他的事情来维护myReader
的上下文。
您可以使用函数表达式,或 bind
。
process.stdout.on('data', function (data) {
myReader.processData(data);
});
process.stdout.on('data', myReader.processData.bind(myReader));
我确信以下两个陈述归结为同一件事。 但是在将第一个语句重构为第二个语句后,我破坏了我的应用程序。
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', (data) => myReader.processData(data));
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', myReader.processData);
为什么这两个不是一回事?
这些箭头函数中没有this
,所以看起来无害。至于 DataReader class 本身:
type DataReaderCallback = (msg: string) => any
export class DataReader {
private _buffer = "";
constructor(private listener: DataReaderCallback = null) {
}
processData(data) {
// remove carriage returns.
data = data.toString().replace(/\r/g, '');
this._buffer += data;
// get only the complete data.
const lastNewlineIndex = this._buffer.lastIndexOf('\n');
if (lastNewlineIndex < 0) return;
if (this.listener != null) {
// split data in lines
const completeData = this._buffer.slice(0, lastNewlineIndex);
const lines = completeData.split('\n');
for (const line of lines) {
// notify listener line by line.
this.listener(line);
}
}
// remove processed data from the buffer.
this._buffer = this._buffer.slice(lastNewlineIndex + 1);
}
}
As for the DataReader class itself…
它确实使用this
,例如this._buffer += data;
所以需要调用processData
的代码需要确保myReader
是它的this
值
箭头函数通过将其称为 myReader.processData(data)
.
如果您将 processData
函数作为参数传递给 on
,那么事件处理代码 不会 在 [= 的上下文中调用它14=]。它甚至不知道 myReader
存在。
如果你想移除箭头函数,那么你必须做一些其他的事情来维护myReader
的上下文。
您可以使用函数表达式,或 bind
。
process.stdout.on('data', function (data) {
myReader.processData(data);
});
process.stdout.on('data', myReader.processData.bind(myReader));