在节点红色中,为什么要继续使用关键字'这个'保存后它的价值?

时间:2017-03-01 22:54:08

标签: javascript node.js node-red

我正在学习如何按照教程Creating your first node创建自己的节点红色节点。如果您查看下面的内容,可以看到this已保存在变量node中,以便您可以在输入“{1}}时发送消息。收到活动。没关系,但为什么继续使用this来注册'输入'事件

module.exports = function(RED) {
    function LowerCaseNode(config) {
        RED.nodes.createNode(this,config);
        var node = this;
        this.on('input', function(msg) {
            msg.payload = msg.payload.toLowerCase();
            node.send(msg);
        });
    }
    RED.nodes.registerType("lower-case",LowerCaseNode);
}

我们无法用this.on('input', function(msg)替换node.on('input', function(msg)吗?

2 个答案:

答案 0 :(得分:2)

当然可以,但为什么我们呢?存储node的唯一原因是我们可以在闭包中使用它,这就是我们将使用它的地方 - 并且只在那里使用它。请注意,this problem还有许多解决方案根本不需要额外的变量。在现代代码(ES6)中,它们实际上更受欢迎。

答案 1 :(得分:2)

  

我们不能用node.on('input',function(msg))替换this.on('input',function(msg)?

是的,你可以。

  

没关系,但为什么继续使用它来注册'输入'事件?

当您选择将this分配给另一个变量时,通常会有两种编码方式,因此可以在闭包中使用。

样式#1 - 在函数顶部指定新变量,然后在函数的任何位置使用它。

样式#2 - 仅在this不是所需值的闭包中使用新变量。

我在实践中都看到过,所以这只是个人风格的问题。例如,here's a question关于以var me = this;开头的方法,然后在函数中的任何位置使用me

就个人而言,我更喜欢样式#2,因为当你在任何地方使用this时,我认为代码更加自我解释。

当然,在ES6环境中或从ES6转换时,您可以使用箭头函数来保留this的词汇值,以便在闭包中使用:

module.exports = function(RED) {
    function LowerCaseNode(config) {
        RED.nodes.createNode(this,config);
        this.on('input', msg => {
            msg.payload = msg.payload.toLowerCase();
            this.send(msg);
        });
    }
    RED.nodes.registerType("lower-case",LowerCaseNode);
}

如果你打电话给 style#3 ,这是我最喜欢的,当ES6中的编码是一个选项时,你需要访问该功能的this没有其他值

仅供参考,也可以在函数上使用.bind()来设置this的值。