【问题标题】:Javascript function call without defined parameters?没有定义参数的Javascript函数调用?
【发布时间】:2020-05-22 08:41:05
【问题描述】:

我是 javascript 新手,一直在关注这个关于套接字如何工作的教程系列:https://www.youtube.com/watch?v=HZWmrt3Jy10

他写道:

var io = socket(server);
io.sockets.on('connection', newConnection);

function newConnection(socket){
    console.log('new connection' + socket.id);
}

newConnection 在 sockets.on 中是如何工作的?它需要一个套接字参数但它可以工作,它也是对函数的引用。我模糊地听说过回调,但仍然感到困惑。谁能解释一下发生了什么。

【问题讨论】:

  • 你能理解吗:io.sockets.on('connection', function(socket){newConnection(socket)});
  • io.sockets.on('connection', newConnection);io.sockets.on('connection', function (socket){ console.log('new connection' + id); }); 相同。该函数只是按名称提取和引用。

标签: javascript function parameters socket.io callback


【解决方案1】:

Javascript 中的函数是“第一类”对象,它们可以被传递、存储在变量等中……考虑这个简单的例子:

function foo(x) {
    console.log("foo(" + x + ") called");
}

function bar(f) {
    f(42);
}

bar(foo);

最后一行调用函数bar,将其作为参数传递给函数foo。函数bar 然后调用它收到的函数f,并将42 作为参数传递。

最终结果将是出现在控制台中的消息foo(42) called

在您展示的代码中,一旦建立连接,on 函数将存储参数以便稍后调用它(提供套接字作为参数)。

【讨论】:

    【解决方案2】:

    你正在传递你的函数,所以 socket.on 方法就像你传递一个变量一样。就像变量一样,socket.on 中的代码随后可以使用您的函数,包括向您传递所需的参数。

    socket.on() 方法的实现方式如下:

    Socket.prototype.on = function (event, callback) {
        // other logic
        callback(socket); // pass socket to your newConnection function
    }
    

    所以当你打电话时:

    io.sockets.on('connection', newConnection);
    

    您将函数newConnection 作为回调传递(这可以由编写socket.on 的程序员命名),然后它将调用您的函数:

    callback(socket); // callback is second parameter so
                      // in your case it is pointing to
                      // newConnection
    

    因此它将套接字传递给您的函数。

    【讨论】:

    • 谢谢,所以我认为任何回调都会将对象作为参数是正确的吗?
    • 这取决于编写socket.on 函数的程序员他将如何调用您的回调。因此,您需要阅读文档以了解他对回调的期望。例如,Array.reduce() 的回调有两个参数 - 累加器和当前项,setTimeout() 的回调没有参数等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2011-06-06
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多