0

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

我对 javascript-has-no-threads 口头禅的基本理解是,运行时将所有 javascript 视为短的“代码块”,它们被安排在一个接一个地执行,而在执行过程中不会从一个块转移。在这种情况下,一段代码(我不知道真正的术语)基本上是由于触发事件处理程序而运行的代码。

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

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

这是准确的(虽然,再一次,不建议)

4

1 回答 1

2

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”变量在事件处理程序周围的闭包中保持“活动”,因此每次调用它都会看到该变量,因为它是最后一次运行。现在,当然,如果在同一个包装函数中创建了其他事件处理程序,那么它们也可以访问该变量。从这个意义上说,对于那些处理程序来说,它就像一个相对全局的变量。

于 2012-07-11T17:12:12.087 回答