Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何控制节点回调中的作用域?_Javascript_Node.js - Fatal编程技术网

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}`);
    });    
})()