Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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_Node.js_Typescript_Web Worker - Fatal编程技术网

javascript函数是否具有可变状态的引用透明性?

javascript函数是否具有可变状态的引用透明性?,javascript,node.js,typescript,web-worker,Javascript,Node.js,Typescript,Web Worker,其中提到参考透明度的定义如下: 引用透明性:函数总是为相同的参数提供相同的返回值。这意味着函数不能依赖于任何可变状态 IIUC Javascript函数满足这一要求,即使它们依赖于可变状态,因为两个函数不能在共享状态下运行,即使它们同时运行?因此总结我们的讨论,是的Javascript函数确实具有引用透明性,只要它们所依赖的可变状态不变 换句话说,当函数所依赖的可变状态保持不变时,将为相同的输入提供相同的输出 这似乎有些明显,但对于Javascript和函数编程来说,这是一个重要的概念/实现,因

其中提到参考透明度的定义如下:

引用透明性:函数总是为相同的参数提供相同的返回值。这意味着函数不能依赖于任何可变状态


IIUC Javascript函数满足这一要求,即使它们依赖于可变状态,因为两个函数不能在共享状态下运行,即使它们同时运行?

因此总结我们的讨论,是的Javascript函数确实具有引用透明性,只要它们所依赖的可变状态不变

换句话说,当函数所依赖的可变状态保持不变时,将为相同的输入提供相同的输出

这似乎有些明显,但对于Javascript和函数编程来说,这是一个重要的概念/实现,因为Javascript不能同时在两个线程中运行函数。如果我们可以在函数运行时更改函数依赖的状态,我们可能会创建难以推理的竞争条件,这将使函数结果不可预测,这正是我们试图通过引用透明性来避免的

例如,依赖于可变状态x的函数fn5将始终为相同的输入返回相同的结果,只要x不变

在非Javascript环境中,可以在函数运行时更改x,因此两次调用fn5可能会返回不同的结果


使用Javascript,如果fn5返回不同的结果,我们就知道确切的原因。这是因为x在fn5调用之间发生了更改。

@Ole javascript是单线程的,所以很难看到两个函数如何同时对共享数据进行操作。不,fn运行时不会,但我认为这并不重要?事实上,x可以被重新分配,而不管它可以在什么时候被重新分配,而知道对于给定的环境,共享可变状态是否是需要担心的事情,这一点当然很重要,这与我提到的问题是不同的,也就是说,当fn运行时,x是否可以改变,即使大多数时候它不能改变,我甚至不确定它什么时候可以改变,fn的输出仍然取决于x,这不是一个参数,因此fn是不纯的,或者,不是引用透明的?不管怎样,我认为区别在于参数是显式输入,而x只是一个外部变量。对于fn的调用者来说,知道fn5将始终返回相同的输入(无论状态如何)是很有用的。虽然其他编程语言对共享可变状态的主要关注点对于JS来说不是问题,因为它是单线程的,但是纯函数仍然可以使代码更容易推理。@MarkMeyer通过创建一个新的单独窗口并在localStorage中存储值,您可以拥有两个线程。实际上,我以前必须处理竞争条件,在localStorage中使用两个窗口读取和写入值。