Javascript 如何控制节点回调中的作用域?
我发现这个对象在同一个对象上的回调之间保持不变。将其用于范围控制是否明智,如下所示Javascript 如何控制节点回调中的作用域?,javascript,node.js,Javascript,Node.js,我发现这个对象在同一个对象上的回调之间保持不变。将其用于范围控制是否明智,如下所示 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
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}`);
});
}
如果不需要从其他地方调用此函数,而只需要执行它,则可以将其设置为
注意:编辑以更正模板字符串(`not')使用的错误字符。它可以正常工作。原因是您没有外部闭包,并且您的侦听器都使用es6箭头函数,因此
此
从不绑定到回调。它们都引用全局此
一种更简洁的方法可能是将它们包装在一个闭包中,并引用一个作用域变量
@jamice答案中的IIFE示例可以满足您的需要。只需编辑es6模板文字,将`instead`用作包装,如下所示:
(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}`);
});
})()
哈哈,有时候一定要爱。你的答案基本上是“Jamiec的答案是正确的”,你得到了投票权。不管怎样,我也是+1!事实上,我的答案就在你的答案发布之前。我添加了你的例子,修复了它,因为它不起作用,并给你评分。在我引用你的例子之前,我的答案被提升了。。。无论如何,祝你有一个美好的一天@KyleRichardson(删除了他的评论,但我还是回答了…)首先,你的例子没有界定“这个”的范围,你正在界定“计数”。。这将是可能的,以同样的方式,我编辑你的答案。另外,我的答案要求更少的代码。。。这也不是Jamiec已经提供的完全正确的答案。gl hf…我删除了我的评论,因为它是无关的。我的回答实际上解释了正在发生的事情,而不仅仅是一个代码示例。在我看来,你的编辑也是一文不值的,所以我拒绝了。接受它,继续前进。
(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}`);
});
})()