JavaScript闭包中的变量

JavaScript闭包中的变量,javascript,asynchronous,closures,Javascript,Asynchronous,Closures,我有一个订阅不同PubNub频道的循环(不要担心PubNub的细节,问题似乎是作用域/闭包)。当我收到一条消息时,我想解决一个承诺 下面代码中的注释指出了该问题。基本上,在pubnub subscribe之外,计数器i给出了期望值,但是在subscribe回调内部,它不是。为什么会这样?我怎么修理它 _.times(3, function(i) { console.log('subscribe'+i); // here counter is working fine pubnub

我有一个订阅不同PubNub频道的循环(不要担心PubNub的细节,问题似乎是作用域/闭包)。当我收到一条消息时,我想解决一个承诺

下面代码中的注释指出了该问题。基本上,在pubnub subscribe之外,计数器
i
给出了期望值,但是在subscribe回调内部,它不是。为什么会这样?我怎么修理它

_.times(3, function(i) {
    console.log('subscribe'+i); // here counter is working fine
    pubnub.subscribe({
        channel_group: 'usersu' + (i + 1) + ':1',
        callback: function(msg) {
            console.log('recv:', msg, message, msg == message, i); // here its not! i is always 0
            if (msg == message) {
                console.log('resolve');
                deferreds[i].resolve();
            }
        },
        error: function(err) {
            deferreds[i].reject(err);
        }
    });
});

我希望你已经解决了这个问题

我修改了您的代码以在浏览器上本地运行它。我声明了一个新函数subscribe(因为我们不知道pub-nub-subscribe是什么)。此代码工作正常,并打印相应的“i”值

我认为您需要为社区进一步调试提供更多的上下文和环境

功能订阅(obj){
控制台日志(对象通道组);
对象回调(“你好”);
对象错误(“错误5”);
}
_.次(3,函数(i){
console.log('subscribe'+i);//这里的计数器工作正常
订阅({
频道组:'usersu'+(i+1)+':1',
回调:函数(msg){
console.log('recv:',msg,“hello”,“hello”==msg,i);//这里不是!我总是0
如果(msg==“你好”){
console.log('resolve');
控制台日志(i);
//延迟[i].resolve();
}
},
错误:函数(err){
console.log(i+“:”+err);
//延期[i]。拒绝(错误);
}
});
});

回调:函数({“msg”:msg,“i”:i}){…可以帮助您吗?@InvernoMuto您无法选择将哪些参数传递给您提供的回调。等等…您的代码为
i
获取了错误的值?它已经在
i
不应该更改的上下文中了…您可以创建一个示例来演示该问题吗?它应该可以正常工作(至少就
i
而言).@T.J.Crowder对不起,我的bad@JiewMeng:您在上面发布的代码不会发生这种情况。正在发生其他事情。创建遗嘱(1)帮你弄清楚它是什么,或者2)给你一些你可以发布问题的东西。我们现在无法回答这个问题,因为问题中的代码不会这样做。