Node.js闭包中并发请求下的变量作用域问题
关于Node.js异步函数并发调用时的作用域与闭包问题
嘿,这个问题问到点子上了——这其实是Node.js异步编程里闭包和函数作用域的核心知识点,我来给你掰扯清楚:
完全不用担心两次调用都会返回name='jane',因为每次调用这个匿名函数(就是你代码里第1行的那个函数),都会创建一个独立的函数作用域,作用域里的name参数是该调用独有的局部变量,两次调用的name完全是互不干扰的副本。
咱们拆解一下执行流程:
- 当调用1发起时,函数创建了一个作用域,其中
name的值是'Fred',随后service.user.sayHello发起HTTP请求(异步操作,会立刻让出执行权); - 几乎同时调用2发起,又创建了一个全新的作用域,这里的
name是'Jane',同样发起HTTP请求后让出执行权; - 当某个HTTP请求的响应回来时,对应的回调函数(第2行开始的那个)会被放入事件队列,等主线程空闲时执行。而这个回调是个闭包,它会捕获当前调用对应的那个函数作用域——也就是说,调用1的回调绑定的是
name='Fred'的作用域,调用2的回调绑定的是name='Jane'的作用域。
所以当第3行执行name = name.toLowerCase()时,只是修改当前回调绑定的那个作用域里的name变量:调用1的回调会把自己作用域里的'Fred'改成'fred',调用2的回调则把自己的'Jane'改成'jane',两者之间没有任何交叉影响。
你担心的“第1行父作用域的引用是否已发生变化”是不会出现的,因为两次调用的父作用域(也就是各自的函数作用域)是完全独立的,不存在共享同一个name变量的情况——它们是两个不同的变量,只是名字相同而已。
举个更直白的例子:就像你两次去咖啡店点单,每次点单的订单都是独立的,哪怕你两次点的都是拿铁,店员也不会把第一次的订单改成第二次的内容~
内容的提问来源于stack exchange,提问作者John Russella
相关产品推荐
相关产品推荐

