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 被初始化(运行 全局范围内的所有代码),然后才调度事件。
我有一个服务工作者扩展,它使用了大量的硬编码值和定义。例如,我们有一个专有协议,它定义了某些由整数标识的消息类型:
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 被初始化(运行 全局范围内的所有代码),然后才调度事件。