JS:服务工作者上下文中幻数的常量

JS: constants for magic numbers in service worker context

我有一个服务工作者扩展,它使用了大量的硬编码值和定义。例如,我们有一个专有协议,它定义了某些由整数标识的消息类型:

const MsgType = {
    MSG_TYPE_1: 0, // not really called like this, just an example
    MSG_TYPE_2: 1

};

根据我的理解,服务工作者不能依赖全局变量。因此,对硬编码值使用常量是行不通的。 JS 没有任何其他方法来设置这种硬编码值。

我只能想出三个办法来解决这个问题:

1- 只需在整个代码中使用硬编码值。我拒绝这样做....

2-使用函数return值如

function MsgType() {
    return {
        MSG_TYPE_1: 0, 
        MSG_TYPE_2: 1
    }
}

3- 用 let 替换 const 并有一个函数重新初始化一切:

let MsgType = null;

function setEveryConstantEverywhere() {
    if (MsgType != null) {
        return;
    }
    // set everything
}

// in code where SW is expected to wake up then call setEveryConstantEverywhere right at the start.

还有别的办法吗?我是不是都弄错了?

好的,所以我运行进行了一些实证测试,现在我有了更好的理解。

1- 每当再次加载扩展服务工作者时,都会在调用事件处理程序之前评估完整的全局上下文。这意味着全局常量正在 RE-defined

2- 可以包含对对象的引用,它将在事件处理程序中可用。但是,如果 SW 已重新启动,则引用将指向新创建的实例,而不是重新启动前设置的实例:

const obj = {/*...*/};
chrome.webRequest.onBeforeRequest.addListener((context => _ => {
   context === obj; // true
})(obj) ,/*...*/);

直觉上,人们会认为被调用的事件处理程序实例是停止 SW 之前设置的那个,但事实并非如此。似乎所有东西都被完全擦除,然后 SW 被初始化(运行 全局范围内的所有代码),然后才调度事件。