首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JavaScript回调的效率

JavaScript回调的效率
EN

Stack Overflow用户
提问于 2012-04-15 04:19:59
回答 2查看 287关注 0票数 2

我只是想确认一下对我的怀疑。

我偶然发现了一篇文章,推荐按以下方式使用Socket.io:

代码语言:javascript
代码运行次数:0
运行
复制
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
    });
});

我觉得以下是更好的资源利用方式:

代码语言:javascript
代码运行次数:0
运行
复制
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事件的匿名函数只在内存中创建一次,但处理action1action2disconnect的匿名函数是为每个套接字连接在内存中创建的。第二种方法的问题是socket不再在范围内。

那么,首先,我对创建函数的怀疑是真的吗?其次,如果是这样的话,是否有一种方法可以将socket放在命名函数的作用域中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-15 04:38:29

使用闭包有助于保持作用域的整洁:

代码语言:javascript
代码运行次数:0
运行
复制
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 

回答您的问题:

那么,首先,我对函数创建的怀疑是真的吗?

是。上面的闭包方法避免了这种情况,回调函数只创建一次。另外:所有都可以看到正确的父作用域。

,其次,如果是这样的话,有没有一种方法可以将socket放在命名函数的作用域中?

socket将在回调中以this的形式提供。

票数 5
EN

Stack Overflow用户

发布于 2012-04-15 04:30:05

您说得对,匿名方法是为每个连接创建的-如果您不需要作用域,那么第二个方法就可以避免这种情况。如果您需要套接字作用域,没有真正的方法可以避免它。如果您希望将方法保留在外部(出于某些其他原因),并且仍然保留作用域,则始终可以:

代码语言:javascript
代码运行次数:0
运行
复制
//...
socket.on('action1', function(){
  action1.apply( socket, arguments );
} );
//... and so forth.

但是这会让你重新为每个连接创建一个方法签名,所以我不确定你会得到什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10157063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档