繁体   English   中英

如何控制节点回调中的范围?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM