Mozilla 扩展:变量作用域
Mozilla Extensions: Variable Scopes
AFAIK,内容脚本中的所有顶级变量在 window 中必须是全局唯一的。因此,如果两个内容脚本都包含像 let port = ...;
这样的行,它们将破坏扩展名。这种行为使得关注点分离变得非常困难,因为如果您将功能分组到目录和文件中,您将混淆哪些变量名仍然可以使用。有没有规范的方法来避免这个问题?
这是一个最小的例子:
manifest.json
{
"manifest_version": 2,
"name": "test",
"version": "1.0",
"applications": {
"gecko": {
"id": "test_script@example.com"
}
},
"content_scripts": [
{
"matches": ["*://*.google.com/*"],
"js": ["read/index.js", "write/index.js"]
}
]
}
read/index.js
console.log("i am read");
write/index.js
console.log("i am write");
当加载 Google 页面时,"i am read" 和 "i am write" 将打印到控制台。但是,如果我们对内容脚本做一些小改动会怎么样:
read/index.js
let message = "i am read";
console.log(message);
write/index.js
let message = "i am write";
console.log(message);
现在只有 "i am read" 会打印。
我当时很傻。谢谢 LukStorms 的回答:我只需要将脚本文件中的代码包装在一个函数中即可设置适当的范围。自从我在 JavaScript 中编码以来已经有一段时间了,我猜...
为了后代,我知道有两种常用的包装代码的方法:
(() => {
code here...
})()
和
function main() {
code here...
}
main();
AFAIK,内容脚本中的所有顶级变量在 window 中必须是全局唯一的。因此,如果两个内容脚本都包含像 let port = ...;
这样的行,它们将破坏扩展名。这种行为使得关注点分离变得非常困难,因为如果您将功能分组到目录和文件中,您将混淆哪些变量名仍然可以使用。有没有规范的方法来避免这个问题?
这是一个最小的例子:
manifest.json
{
"manifest_version": 2,
"name": "test",
"version": "1.0",
"applications": {
"gecko": {
"id": "test_script@example.com"
}
},
"content_scripts": [
{
"matches": ["*://*.google.com/*"],
"js": ["read/index.js", "write/index.js"]
}
]
}
read/index.js
console.log("i am read");
write/index.js
console.log("i am write");
当加载 Google 页面时,"i am read" 和 "i am write" 将打印到控制台。但是,如果我们对内容脚本做一些小改动会怎么样:
read/index.js
let message = "i am read";
console.log(message);
write/index.js
let message = "i am write";
console.log(message);
现在只有 "i am read" 会打印。
我当时很傻。谢谢 LukStorms 的回答:我只需要将脚本文件中的代码包装在一个函数中即可设置适当的范围。自从我在 JavaScript 中编码以来已经有一段时间了,我猜...
为了后代,我知道有两种常用的包装代码的方法:
(() => {
code here...
})()
和
function main() {
code here...
}
main();