[英]How to control scope in node callbacks?
在我周围玩耍时发现这个对象在同一个对象上的回调中保持不变。 将其用于范围控制是否明智如下。
process.stdin.once('data', (chunk) => {
this.count = 0;
})
process.stdin.on('data', (chunk) => {
this.count += chunk.length;
});
process.stdin.on('end', () => {
console.log(`N of bytes ${this.count}`);
});
由于我没有经常看到这一点,我想知道它是否有任何问题或更好的方法存在。
函数有自己的范围,你可以使用:
function doSomething(){
var count = 0;
process.stdin.once('data', (chunk) => {
count = 0;
})
process.stdin.on('data', (chunk) => {
count += chunk.length;
});
process.stdin.on('end', () => {
console.log(`N of bytes ${count}`);
});
}
如果不需要从其他地方调用此函数,并且您只是希望它执行,那么可以将其设置为IIFE
(function(){
var count = 0;
process.stdin.once('data', (chunk) => {
count = 0;
})
process.stdin.on('data', (chunk) => {
count += chunk.length;
});
process.stdin.on('end', () => {
console.log(`N of bytes ${count}`);
});
})()
注意:编辑纠正用于模板化字符串的错误字符(“不”)
它的确有效。 原因是你没有外部闭包,你的听众都使用es6箭头函数,所以this
永远不会绑定到回调。 他们都参考全球this
。
更简洁的方法可能是将它们包装在一个闭包中并引用一个范围变量。
@ Jamiec答案中的IIFE示例将满足您的目的。 只需编辑es6模板文字,使用`而不是'作为包装,如下所示:
(function(){
var count = 0;
process.stdin.once('data', (chunk) => {
count = 0;
})
process.stdin.on('data', (chunk) => {
count += chunk.length;
});
process.stdin.on('end', () => {
console.log(`N of bytes ${count}`);
});
})()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.