代码之家  ›  专栏  ›  技术社区  ›  Emilio

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

  •  -4
  • Emilio  · 技术社区  · 7 年前

    var messageProcessing = function() {
        console.log(message);
    };
    
    process.on('message', function(message) { 
        messageProcessing();
    });
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   nnnnnn    7 年前

    你的 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
  •  0
  •   Jaromanda X    7 年前

    其他两种解决方案

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