js事件循环是否意味着可以为临时暂存空间使用全局变量

Does the js event-loop mean you can use global variables for temp scratch-space?

本文关键字:空间 全局变量 循环 事件 是否 意味着 js      更新时间:2023-09-26

*免责声明:我并不是说这是个好主意——事实上,我会明确地说不是——所以,通过尝试理解事件循环对编码风格的确切含义来回答这个问题

我对javascript无线程咒语的基本理解是,运行时将所有javascript都视为短的"代码块",这些代码块被一个接一个地调度执行,而在执行过程中从未偏离块。在这种情况下,一块代码(我不知道真正的术语)基本上是由于触发事件处理程序而运行的代码。

如果我的理解是正确的,那就意味着如果全局变量的使用不跨越一个以上的"代码块",那么从技术上讲,使用全局变量是100%安全的。

因此,例如,如果我有一个全局对象window.workspace,我可以让我的事件处理程序和从那里流出的任何代码——而不是将临时变量存储在闭包中——将它们全部存储在window.workspace中。只要我不认为工作区在对事件处理程序(甚至是同一个)的调用之间保留任何状态,这应该是完全安全的。

这准确吗(不过,再次不建议)

JavaScript事件机制的具体工作方式取决于运行JavaScript的容器。可以建立一个系统,其中事件处理程序总是在每次调用时传递某种持久状态对象。

然而,在像Node.js这样的浏览器和系统中,你的问题的答案(在我理解的范围内)是一个谨慎的"是",或者可能是"是但是"。

因为JavaScript有闭包,所以确保持久性(不像DB持久性;我的意思是在事件处理程序的调用中持久性)但私有存储的一种更干净的方法是这样做:

(function(global) {
  var persistentValue = 12;
  // set up an event handler
  global.whatever().handleEvent(function() {
    if (persistentValue > 12) { ... }
    else { persistentValue ++; }
  });
})( this );

其想法是,"persistentValue"变量在事件处理程序周围的闭包中保持"活动"状态,因此每次调用它时,它都会将该变量视为上次运行时的变量。当然,如果在同一包装函数中创建了其他事件处理程序,那么它们也可以访问该变量。从这个意义上说,对于那些处理程序来说,它就像是一个相对全局的变量。