函数外变量如何工作?
How outside-function-variables works?
我不太明白 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
Does it allocate heap memory for variable "a"?
我认为我们不应该考虑它。 js虚拟机比较复杂
Does it use mutexes to protect the variable?
Js 是单线程的。在当前同步功能结束之前,没有人 promise/async 会调用。
用过C++这样的语言后很难不去想这些细节,但是js真的很简单
(此处为 V8 开发人员。)
Does it allocate heap memory for variable "a"?
是的。正如 V8 所说,a
将被“上下文分配”,因此在 scope
中创建的闭包(例如 f
和 g
)可以访问它(通过它们的“语境”)。这与异步函数无关:如果您只在示例中定义了 g
,那仍然会发生。
另外,这是一个实现细节。如果您要实现尽可能简单的 JavaScript 引擎,您只需堆分配所有变量。现代高性能 JS 引擎会尽可能地尝试堆栈分配变量,这就是导致这种区别的原因;但这只是一种优化,不会改变任何可观察到的行为。
Does it use mutexes to protect the variable?
不需要。 async function
不会同时 运行...
so how async functions work ?
...参见例如这里有一个非常详细的描述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
简而言之,async
/await
主要只是语法糖,让您避免“回调地狱”,而是编写看起来直线的代码(但在引擎盖下被分成块).它 不会 向 JavaScript 添加并发性。
every X instructions javascript will check a queue or something to see if there is async functions to execute concurrently ?
否(因为这实际上是并发)。当控制returns到事件循环(即所有活动函数都已返回)时,将调用下一个等待回调。
我不太明白 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
Does it allocate heap memory for variable "a"?
我认为我们不应该考虑它。 js虚拟机比较复杂
Does it use mutexes to protect the variable?
Js 是单线程的。在当前同步功能结束之前,没有人 promise/async 会调用。 用过C++这样的语言后很难不去想这些细节,但是js真的很简单
(此处为 V8 开发人员。)
Does it allocate heap memory for variable "a"?
是的。正如 V8 所说,a
将被“上下文分配”,因此在 scope
中创建的闭包(例如 f
和 g
)可以访问它(通过它们的“语境”)。这与异步函数无关:如果您只在示例中定义了 g
,那仍然会发生。
另外,这是一个实现细节。如果您要实现尽可能简单的 JavaScript 引擎,您只需堆分配所有变量。现代高性能 JS 引擎会尽可能地尝试堆栈分配变量,这就是导致这种区别的原因;但这只是一种优化,不会改变任何可观察到的行为。
Does it use mutexes to protect the variable?
不需要。 async function
不会同时 运行...
so how async functions work ?
...参见例如这里有一个非常详细的描述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
简而言之,async
/await
主要只是语法糖,让您避免“回调地狱”,而是编写看起来直线的代码(但在引擎盖下被分成块).它 不会 向 JavaScript 添加并发性。
every X instructions javascript will check a queue or something to see if there is async functions to execute concurrently ?
否(因为这实际上是并发)。当控制returns到事件循环(即所有活动函数都已返回)时,将调用下一个等待回调。