【问题标题】:How outside-function-variables works?外部函数变量如何工作?
【发布时间】:2021-03-14 22:23:11
【问题描述】:

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

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

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

有人可以在这个例子中阐明 V8 的内部工作原理吗?

提前谢谢你

let f, g;
function scope() {
    let a = 1;
    f = async function() {
        a = 2;
    }
    g = function() {
        return a;
    }
};
scope();
f().then( _ => console.log(g()) ); // print 2

【问题讨论】:

标签: javascript v8


【解决方案1】:

(这里是 V8 开发人员。)

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

是的。正如 V8 所说,a 将是“上下文分配的”,因此在 scope 中创建的闭包(例如 fg)可以访问它(通过它们的“上下文”)。这与异步函数无关:如果您在示例中只定义了g,那仍然会发生。

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

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

不需要。 async function 不会同时运行...

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

...参见例如这里有非常详细的描述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

简而言之,async/await 主要是语法糖,让您避免“回调地狱”,而是编写看起来直线的代码(但在后台被分成块)。它确实向 JavaScript 添加并发。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    Js 是单线程的。在当前同步函数结束之前,不会调用任何 Promise/async。 用过C++这样的语言,想想这些细节就很难不去想,但是js真的很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2020-10-30
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      相关资源
      最近更新 更多