我正在学习如何按照教程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)
吗?
答案 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
的值。