js事件循环是否意味着可以为临时暂存空间使用全局变量
Does the js event-loop mean you can use global variables for temp scratch-space?
*免责声明:我并不是说这是个好主意——事实上,我会明确地说不是——所以,通过尝试理解事件循环对编码风格的确切含义来回答这个问题
我对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"变量在事件处理程序周围的闭包中保持"活动"状态,因此每次调用它时,它都会将该变量视为上次运行时的变量。当然,如果在同一包装函数中创建了其他事件处理程序,那么它们也可以访问该变量。从这个意义上说,对于那些处理程序来说,它就像是一个相对全局的变量。
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 如何为HTML属性/选择器创建全局名称空间或变量
- 带有 jquery、全局命名空间的变量的 $ 前缀
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- 命名空间和全局变量
- 在javascript d3.js中使用命名空间时,全局变量未更新
- Javascript全局变量和命名空间
- 访问命名空间中的全局变量