JavaScript回调的效率

knp*_*wrs 2 javascript scope node.js socket.io

我只是想证实我的怀疑.

我偶然发现了一篇建议以下列方式使用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
    });
});
Run Code Online (Sandbox Code Playgroud)

我觉得以下会更好地利用资源:

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
}
Run Code Online (Sandbox Code Playgroud)

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

首先,我怀疑函数的创建是真的吗?其次,如果有办法进入socket命名函数的范围?

Tom*_*lak 5

使用闭包有助于保持范围清洁:

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 
Run Code Online (Sandbox Code Playgroud)

对你的问题:

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

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

其次,如果有办法进入socket命名函数的范围?

socket将作为this在回调.