对使用逗号分隔的函数查看chrome扩展代码感到困惑



我正在尝试了解更多关于chrome扩展的知识,我学习的最好方法是查看有效的东西并尝试了解它在做什么。好吧,我已经对我一直在看的一个有了很好的理解,但我看到了很多奇怪的东西,我真的不确定为什么它们是这样写的。以下是我正在查看的内容片段:

chrome.runtime.onMessage.addListener((o, s, c) => {
c(),
(function(o, s, c) {
<code>
})
(o.url, o.headers)
});

我不明白的是,为什么前两个语句用逗号分隔,而第三个语句只用括号括起来。如果我删除逗号,那么控制台中有一个错误,说明

事件处理程序中的错误:TypeError:c(…)不是函数

这似乎是在以某种方式将c函数与逗号后的函数联系起来。我真的不知道它发生了什么,它不是我唯一看到它的地方。在background.js中,chrome.webRequest.onSendHeaders.addListener()chrome.runtime.onMessage.addListener()的下一个函数用逗号分隔

chrome.webRequest.onSendHeaders.addListener(
<code>
),
chrome.runtime.onMessage.addListener(
<other code>
)

我尽力往上看,但找不到任何能回答我问题的东西。有人能向我解释一下吗?

这基本上等同于以下代码:

缩小后的代码在语句之间使用逗号运算符,而不是分号。

它使用IIFE为<code>创建嵌套的变量作用域。(o.url, o.headers)是IIFE的自变量。在现代ES6语法中,这可以使用块和let变量绑定来完成。

我已经将侦听器的o参数重命名为o1,这样它就不会与嵌套块中的o变量冲突。

chrome.runtime.onMessage.addListener((o1, s, c) => {
c(); 
{
let o = o1.url;
let s = o1.headers;
let c;
// <code>
}
});

最新更新