Javascript 如何维护对正确对象的引用?

Javascript 如何维护对正确对象的引用?,javascript,node.js,reference,socket.io,Javascript,Node.js,Reference,Socket.io,我有这样的代码: for (var index = 1; index < args.length; index++) { var shell = args[index]; listener.of('/' + shell.namespace || 'shotgun') .on('connection', function (socket) { socket.on('execute', function (cmdStr, context,

我有这样的代码:

for (var index = 1; index < args.length; index++) {
    var shell = args[index];
    listener.of('/' + shell.namespace || 'shotgun')
        .on('connection', function (socket) {
            socket.on('execute', function (cmdStr, context, options) {
                console.log('Received: ' + cmdStr);
                var result = shell.execute(cmdStr, context, options);
                socket.emit('result', result);
            });
        });
}

我正在使用并且正在创建多个名称空间。io名称空间工作得很好,但在执行回调中,对shell的引用始终是for循环中创建的最后一个对象。我需要循环的每次迭代都保留对该迭代中shell的引用。

那么,最终的答案将是使用ECMAScript 6或:

而且,如果args是数组,也可以通过以下方法完成:


以下是使用.bind解决您的挑战的解决方案之一


问题是您正在创建一个闭包,该闭包引用变量shell,并在调用函数时(而不是在定义函数时)对变量求值。您需要创建一个引用循环变量当前值的闭包。有几种方法,但一种是使用:


注意:IIFE的形式参数可以使用相同名称的shell,这会将变量隐藏在外部作用域中,但我将其重命名为_shell以澄清发生了什么。

非常聪明。确实非常聪明。完全忘记了。forEach和它如何提供一个适当的闭包。非常感谢。
for (let index = 1; index < args.length; index++) {
    let shell = args[index];
    // ...
}
function iterator(shell, index) {
    listener.of('/' + shell.namespace || 'shotgun')
        // ...
}

for (var index = 1; index < args.length; index++) {
    iterator(args[index], index);
}
args.forEach(function (shell, index) {
    listener.of('/' + shell.namespace || 'shotgun')
        // ...
});
for (var index = 1; index < args.length; index++) {
  var shell = args[index];
  listener.of('/' + shell.namespace || 'shotgun')
    .on('connection', function(socket) {
      shell = this.shell;
      socket.on('execute', function (cmdStr, context, options) {
        console.log('Received: ' + cmdStr);
        var result = shell.execute(cmdStr, context, options);
        socket.emit('result', result);
      });
    }.bind({ shell: shell }));
}
for (var index = 1; index < args.length; index++) {
    var shell = args[index];
    listener.of('/' + shell.namespace || 'shotgun')
        .on('connection', (function (_shell) { return function (socket) {
            socket.on('execute', function (cmdStr, context, options) {
                console.log('Received: ' + cmdStr);
                var result = _shell.execute(cmdStr, context, options);
                socket.emit('result', result);
            }; }(shell)));
        });
}