gpt4 book ai didi

javascript - JavaScript 回调的效率

转载 作者:搜寻专家 更新时间:2023-11-01 00:19:03 25 4
gpt4 key购买 nike

我只是想证实我的怀疑。

我偶然发现一篇文章建议按以下方式使用 Socket.io:

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
socket.on('action1', function (data) {
// logic for action1
});

socket.on('action2', function (data) {
// logic for action2
});

socket.on('disconnect', function(){
// logic for disconnect
});
});

我觉得以下内容可以更好地利用资源:

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
socket.on('action1', action1);
socket.on('action2', action2);
socket.on('disconnect', disconnect);
});

function action1(data) {
// logic for action1
}

function action2(data) {
// logic for action2
}

function disconnect() {
// logic for disconnect
}

我的感觉是,虽然处理 connection 的匿名函数事件只在内存中创建一次,处理 action1 的匿名函数, action2 , 和 disconnect为每个套接字连接在内存中创建。第二种方法的问题是 socket不再在范围内。

那么首先,我对创建函数的怀疑是真的吗?其次,如果有的话,有没有办法得到 socket在命名函数的范围内?

最佳答案

使用闭包有助于保持作用域干净:

io.sockets.on('connection', function () {
function action1(data) {
// logic for action1
}
function action2(data) {
// logic for action2
}
function disconnect() {
// logic for disconnect
}
return function (socket) {
socket.on('action1', action1);
socket.on('action2', action2);
socket.on('disconnect', disconnect);
}
}()); // <- note the immediate function call

您的问题:

So firstly, is my suspicion about the creation of functions true?

是的。上面的闭包方法防止了这种情况,回调函数只创建一次。另外:所有人都能看到正确的父范围。

And secondly, if so is there a way to get socket in scope for the named functions?

socket 将在回调中用作 this

关于javascript - JavaScript 回调的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10157063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com