Javascript 外部函数变量是如何工作的?

Javascript 外部函数变量是如何工作的?,javascript,v8,Javascript,V8,我真的不明白V8是如何处理这种代码的 它是否为变量“a”分配堆内存 它是否使用互斥来保护变量 在本例中,是否有人能解释一下V8的内部工作原理 先谢谢你 设f,g; 函数范围(){ 设a=1; f=异步函数(){ a=2; } g=函数(){ 返回a; } }; 范围(); 然后(=>console.log(g());//打印2 它是否为变量“a”分配堆内存 我认为我们不应该考虑它。Js虚拟mashine相当复杂 它是否使用互斥来保护变量 Js是单线程的。在当前sync func结束之前,不会调

我真的不明白V8是如何处理这种代码的

它是否为变量“a”分配堆内存

它是否使用互斥来保护变量

在本例中,是否有人能解释一下V8的内部工作原理

先谢谢你

设f,g;
函数范围(){
设a=1;
f=异步函数(){
a=2;
}
g=函数(){
返回a;
}
};
范围();
然后(=>console.log(g());//打印2
它是否为变量“a”分配堆内存

我认为我们不应该考虑它。Js虚拟mashine相当复杂

它是否使用互斥来保护变量

Js是单线程的。在当前sync func结束之前,不会调用任何承诺/async。 在使用C++语言之后,很难停止思考这些细节,但是JS非常简单。

(V8开发者)。 它是否为变量“a”分配堆内存

对。正如V8所说,
a
将被“上下文分配”,这样在
范围
中创建的闭包(例如
f
g
)就可以访问它(通过它们的“上下文”)。这与异步函数无关:如果您在示例中只定义了
g
,这种情况仍然会发生

此外,这是一个实现细节。如果要实现尽可能简单的JavaScript引擎,只需堆分配所有变量即可。现代高性能JS引擎试图在可能的情况下堆叠分配变量,这就是导致这种区别的原因;但这只是一种优化,不会改变任何可观察到的行为

它是否使用互斥来保护变量

不需要。
异步函数
不会同时运行

那么异步函数是如何工作的呢

…有关非常详细的说明,请参见此处:

简而言之,
async
/
await
基本上只是语法上的糖分,允许您避免“回调地狱”,而是编写看起来直线的代码(但在引擎盖下会被分成块)。它不会向JavaScript添加并发性

每个X指令javascript都会检查一个队列或其他东西,看看是否有异步函数可以并发执行


否(因为这实际上是并发)。当控件返回到事件循环(即所有活动函数都已返回)时,将调用下一个等待的回调。

。您不需要互斥体。好的,那么异步函数如何工作呢?异步函数与并发运行。好的,谢谢您的帮助。所以每个X指令javascript都会检查一个队列或其他东西,看看是否有异步函数可以并发执行?解释得很清楚,谢谢!