Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的可重入性_Javascript_Reentrancy - Fatal编程技术网

JavaScript中的可重入性

JavaScript中的可重入性,javascript,reentrancy,Javascript,Reentrancy,我想提高我对可重入这个词的理解 这个函数是可重入的吗 function* foo() { yield 1; yield 2; } 这个呢 function foo() { return 1; } var x = 0; function foo() { return x++; } function foo() { setTimeout(foo, 1000); } 这个呢 function foo() { return 1; } var x = 0; functio

我想提高我对可重入这个词的理解

这个函数是可重入的吗

function* foo() {
  yield 1;
  yield 2;
}
这个呢

function foo() {
  return 1;
}
var x = 0;
function foo() {
  return x++;
}
function foo() {
  setTimeout(foo, 1000);
}
这个呢

function foo() {
  return 1;
}
var x = 0;
function foo() {
  return x++;
}
function foo() {
  setTimeout(foo, 1000);
}
这个呢

function foo() {
  return 1;
}
var x = 0;
function foo() {
  return x++;
}
function foo() {
  setTimeout(foo, 1000);
}

reentrent函数是可以恢复执行的函数:

在计算中,计算机程序或子例程被称为可重入的,如果它在执行过程中被中断,然后在其先前调用完成执行之前安全调用(“重新输入”)。p> 在浏览器/节点JavaScript中,所有多处理都是协作的(没有中断或上下文切换)在JavaScript中,常规函数始终运行到完成。(1)

因此,在您的例子中,唯一的reentrent函数是第一个函数,因为它不会运行代码直到完成,并且可以在以后继续运行

  • 第二个函数只是一个正则函数
  • 第三个使用外部作用域,这有点类似,因为它允许函数保存某些状态。但这不是同一件事,因为函数无法恢复
  • 第四个只是立即运行完成(它安排了对它的另一次调用——但这取决于平台,而不是JavaScript)
事实上,可以说生成器使用可重入语法在JavaScript中支持协作多任务处理。在生成器之前,所有代码都运行完成


(1) 或者它从不停止,但从不中断。同样,在通用平台中。有些平台(比如Rhino)违反了规则。它们非常罕见,并且不使用与浏览器/节点JS相同的并发执行模型

也看到,这是一个C++相关的问题,但是答案仍然是一样的。如果有人想知道的话,这不是一个重复的问题,因为那不是关于JavaScript和C++有一个不同的执行模型。@嗨,你找到了正确的答案,你介意把它分享给我们吗?为什么2不能再进入?虽然javascript执行模型不允许一次调用多次,但它仍然是可重入的。所有正则函数都是可重入的,因为它不能在执行过程中被中断,然后在其先前调用之前安全调用,从而完成执行——简单明了。更简单地说,它可以在执行过程中不被中断。这与发电机不同,发电机可以声明中断点(产量)并“泵送”到执行完成。否。完全不是。这与定义背道而驰。您可以一次调用(2)多次,它仍然会一致地返回相同的结果。这就是它的可重入性。JS不支持并行执行的事实与此无关。对于不同的语言,可重入性的定义没有什么不同。JS支持并行执行(只是不支持线程,好吧,JS在do上运行的平台)。我认为您缺少的一点是,reentrency要求首先中断功能。@Sulthan如果您不同意这个答案,请提供您自己的答案,社区可以达成共识。