有人能解释一下这个代码有什么问题以及如何修复它吗?(JavaScript闭包)

有人能解释一下这个代码有什么问题以及如何修复它吗?(JavaScript闭包),javascript,node.js,closures,Javascript,Node.js,Closures,有人能解释一下这个代码有什么问题以及如何修复它吗?我真的迷路了。谢谢 var messageProcessing = function() { console.log(message); }; process.on('message', function(message) { messageProcessing(); }); 您的messageProcessing()函数尝试引用超出范围的message变量,因此您会得到一个引用错误。它不能引用在其他函数中声明的参数或变量(

有人能解释一下这个代码有什么问题以及如何修复它吗?我真的迷路了。谢谢

var messageProcessing = function() {
    console.log(message);
};

process.on('message', function(message) { 
    messageProcessing();
});

您的
messageProcessing()
函数尝试引用超出范围的
message
变量,因此您会得到一个引用错误。它不能引用在其他函数中声明的参数或变量(除非它嵌套在这些其他函数中,在本例中它不是,在这里嵌套也没有意义)

请注意,这并不是关于闭包的,它只是一个基本的范围问题

您可以像这样显式地传递值:

var messageProcessing = function(message) {  // add argument to this function
    console.log(message);
};

process.on('message', function(message) { 
    messageProcessing(message);             // pass value through
});
…或者您可以完全避免中间匿名函数:

var messageProcessing = function(message) { // add argument to this function
    console.log(message);
};

process.on('message', messageProcessing);   // note no () after messageProcessing
                                            // because this line doesn't invoke it
                                            // it just passes a reference to `.on()`
…或者,您可以避免使用命名函数,并在匿名函数中执行所需的所有操作:

process.on('message', function(message) {
    console.log(message);
});
另外两个解决方案

将消息传递给messageProcessing函数

var messageProcessing = function(message) {
    console.log(message);
};

process.on('message', function(message) { 
    messageProcessing(message);
});
或者,在获取消息的函数表达式中包含messageProcessing函数

process.on('message', function(message) { 
    var messageProcessing = function() {
        console.log(message);
    };
    messageProcessing();
});

这不是一个真正的结束问题。
messageProcessing()
函数尝试使用一个变量
message
,该变量不在作用域内,因为它仅定义为后面函数表达式的参数。您应该指定问题,您得到了什么?错误警告发生了什么?(它没有调用函数)-(…)中的后一个函数表达式调用
messageProcessing()
(响应消息事件)。然后你得到了我已经提到的问题,那就是
message
不在该函数的作用域中,它只被定义为另一个函数的参数。@Emilio将
message
传递到
messageProcessing()
的可能重复项。JavaScript具有词汇作用域,而不是动态作用域。