javascript - 作用域和异步 JavaScript

标签 javascript asynchronous scope

我最近在工作中遇到了一个问题,至少根据我对 JavaScript 的了解,我得到了一个不可能的结果。我希望有人能解释这里发生了什么,以及为什么实际结果与我的预期结果不同。

控制台中的预期结果

id: a , x: 1
id: b , x: 1
id: c , x: 1

控制台中的实际结果

id: c , x: 1
id: c , x: 2
id: c , x: 3

代码

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");

最佳答案

response_callback = q();

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

这意味着您每次调用 DoStuff() 时都会覆盖它。您认为您正在捕获和调用三个不同的函数,但实际上只有一个...

 var response_callback = q(); // should set you back on track

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

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

...并在没有不必要的关闭的情况下看到相同的结果。

关于javascript - 作用域和异步 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3392442/

相关文章:

javascript - 获取已知端口上Websocket的IP

javascript - Select2 - 在删除 tabindex 的 bootstrap 3 中不起作用?

javascript - 如何使用替换来去掉数字?

mysql - 在nodejs中正确的异步mysql查询?

c - 在 C 中,如何将全局变量的范围限制在声明它的文件中?

javascript - 苹果网络后端技术

javascript - 导出从 ES6 中的异步/等待函数返回的值

node.js - 在 Nodejs 中编写异步 http 返回

php - 多个文件和命名空间范围

javascript - 访问函数内的变量::TypeScript & Angular2