【问题标题】:Can someone please explain what is wrong with this code and how to fix it? (JavaScript closure) [closed]有人可以解释一下这段代码有什么问题以及如何解决吗? (JavaScript 闭包)[关闭]
【发布时间】:2017-09-27 03:04:43
【问题描述】:

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

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

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

【问题讨论】:

  • 不是真正的关闭问题。 messageProcessing() 函数尝试使用不在作用域内的变量 message,因为它只定义为后面函数表达式的参数。
  • 你应该指定问题,你会得到什么?错误?警告?会发生什么
  • "(它没有调用函数)" - process.on(...) 中的后面函数表达式调用 messageProcessing()(响应消息事件)。然后你会得到我已经提到的问题,即message 不在该函数的范围内,它只定义为另一个函数的参数。
  • @Emilio 将message 传递给messageProcessing()
  • What is the scope of variables in JavaScript? 的可能重复项。 JavaScript 有 词法 范围,而不是动态范围。

标签: javascript node.js closures


【解决方案1】:

您的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);
});

【讨论】:

    【解决方案2】:

    另外两种解决方案

    将消息传递给 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();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2018-05-09
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多