有人能解释一下这个代码有什么问题以及如何修复它吗?(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具有词汇作用域,而不是动态作用域。