gpt4 book ai didi

javascript - JavaScript 中的可重入性是什么意思?

转载 作者:行者123 更新时间:2023-11-30 11:20:56 26 4
gpt4 key购买 nike

我看过What exactly is a reentrant function?Reentrancy in JavaScript .

但是还是一头雾水,好像重入是并发的,纯粹的,递归的。不知道generator是不是reentrancy的实现,如果是的话,它和pure/recursive或者其他语言有什么关系。

希望得到您的答复,谢谢!

最佳答案

Reentrancy在 JS 中的含义与在其他语言中的含义相同:当例程仍在运行时再次调用时,将重新进入例程。它在安全的情况下被称为可重入(“安全”是一个非常宽泛的术语,通常意味着“一切都按预期工作”)——或者更正式地说,函数仍然是fulfills its contract。当以这种方式调用时。

有几个场景与 JS 相关(其中一个函数通常运行到完成而不会被其他东西“中断”):

  • 该函数是异步的。这两个调用的一部分可能会相互交错运行。如果这种交错以开发人员未预料到的方式发生,则称为竞争条件。
  • 该函数接受(并调用)回调。用户提供的回调可能会再次调用该函数。
  • 该函数是一个生成器函数。多次调用,生成器交替消耗。

仅使用调用局部状态(或完全纯)的函数始终是可重入的。当您的函数修改全局状态时,事情会变得一团糟,尤其是当它“仅在函数调用期间”确实破坏了数据结构的不变量时。

这是一个不可重入生成器函数的简单示例:

var k = 0;
function* countTo(n) {
while (k < n)
yield k++;
k = 0;
}
for (const x of countTo(3))
console.log(x);
for (const y of countTo(7))
console.log(y);

有效,对吗?不,它不是,因为 k 在这里是一个全局变量。考虑一下

for (const x of countTo(3))
for (const y of countTo(7))
console.log(x, y);

糟糕。编写为可重入生成器函数的相同功能:

function* countTo(n) {
for (var k = 0; k < n; k++)
yield k;
}

关于javascript - JavaScript 中的可重入性是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com