范围和异步JavaScript

B K*_*yes 6 javascript scope asynchronous

我最近在其中,至少根据我的JavaScript知识遇到了一个问题,在工作中,我回来是不可能的结果.我希望有人可以解释这里发生的事情,以及为什么实际结果与我的预期结果不同.

控制台中的预期结果

id: a , x: 1
id: b , x: 1
id: c , x: 1
Run Code Online (Sandbox Code Playgroud)

控制台中的实际结果

id: c , x: 1
id: c , x: 2
id: c , x: 3
Run Code Online (Sandbox Code Playgroud)

function MyClass(id)
{
    var x = 0;

    return function()
    {
        return function()
        {
            x += 1;
            console.log("id: ", id, ", x: ", x);
        }
    }
}


function DoStuff(id)
{
    var q = MyClass(id);
    response_callback = q();
    setTimeout(function(){ response_callback(); }, 50);
}

DoStuff("a");
DoStuff("b");
DoStuff("c");
Run Code Online (Sandbox Code Playgroud)

Sho*_*og9 6

response_callback = q();
Run Code Online (Sandbox Code Playgroud)

这个.您没有在任何范围内声明response_callback,因此它隐含在全局范围内...

这意味着你每次打电话都会覆盖它DoStuff().你认为你已经获得了三个不同的功能并被召唤,但只有一个......

 var response_callback = q(); // should set you back on track
Run Code Online (Sandbox Code Playgroud)

当然,你现在拥有这种结构的方式有点浪费MyClass能够返回一个返回函数的函数.你实际上可以写:

function DoStuff(id)
{
  var q = MyClass(id);
  // ... do other strange and horrible things with q ...
  setTimeout(q(), 50);
}
Run Code Online (Sandbox Code Playgroud)

......并且在没有不必要的封闭的情况下看到相同的结