Google Side Bar服务端JS全局变量是否会在多次调用间共享?
问题1:该隔离表现是否是确定性的?
在Google Apps Script(Google Side Bar服务端脚本的运行环境)中,这个表现是100%确定的。
- 你观察到的公共变量不共享的核心原因是GAS的执行实例隔离机制:每一次来自客户端的函数调用请求,都会被分配到独立的沙箱执行上下文,全局作用域的变量会在每个上下文初始化时重新创建,请求处理完成后上下文就会被销毁,不同请求之间完全不会共享全局变量状态。
- 你提到的10秒等待并发场景只是让这个特性表现得更明显,不是核心诱因:哪怕你等待
getfirstCall完全返回后再调用getsecondCall,后者拿到的依然是只有Item2的数组,前一次请求对publicArr的修改会随着前一个执行实例销毁完全丢失。 - 如果需要在多次请求之间共享数据,必须使用GAS提供的持久化/缓存能力:比如
PropertiesService存储配置、CacheService做临时缓存、或者将数据写入关联的表格/文档中。
问题2:该特性是否属于Web开发通用基础规则?
不是,这是GAS这个特定运行环境的设计,不属于通用规则。
- 不同服务端运行环境的上下文隔离策略差异极大:
- 类似Node.js、Python Django/Flask(常驻进程模式)这类环境,全局变量是整个进程共享的,所有请求都会读写同一个全局变量,你这段代码在Node.js服务中运行的话,两次调用返回的数组都会同时包含
Item1和Item2。 - 类似PHP、传统CGI这类环境,每次请求都会启动独立的进程/上下文,请求结束后销毁,全局变量也不会共享,和GAS的表现一致。
- 类似Node.js、Python Django/Flask(常驻进程模式)这类环境,全局变量是整个进程共享的,所有请求都会读写同一个全局变量,你这段代码在Node.js服务中运行的话,两次调用返回的数组都会同时包含
- 所以全局变量是否跨请求共享,完全取决于你用的服务端运行环境的设计,没有统一的通用规则。
你提供的示例代码参考:
const publicArr = []; function doWait2(ms){ var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); } } function getfirstCall(){ publicArr.push("Item1"); doWait2(10000); return publicArr; } function getsecondCall(){ publicArr.push("Item2"); return publicArr; }
内容的提问来源于stack exchange,提问作者OJNSim
相关产品推荐
相关产品推荐

