在MDN的this link中,它解释了如何编写单元测试以开发firefox的插件。但是,在搜索谷歌之后,有几个我不理解的段并且没有找到任何有用的结果。
第一个,以下是从上面链接引用的段落:
在网页中,您可以使用。执行Base64编码和解码 btoa()和atob()函数。不幸的是这些功能 附加到窗口对象:因为此对象不可用 您的主要附加代码,atob()和btoa()也不可用。所以 我们将创建一个base64模块来公开这些函数 平台(请参阅创建可重用模块)。
上段中的“平台”是什么意思? “Services.jsm”?
同样在以下代码中:
const { atob, btoa } = require("resource://gre/modules/Services.jsm");
这使得atob和btoa成为其他类可用的服务之一?或者使(常量变量)atob和btoa都引用Services.jsm?
第二个: 这两行代码是做什么的?
exports.atob = a => atob(a);
exports.btoa = b => btoa(b);
我理解这部分
exports.atob
使atob函数可以从“base64.js”之外的其他类中获得。 但以下是什么意思?
= a => atob(a);
我没有发现javascript有“=>”操作者!
从我的理解,我们创建base64.js的原因是因为只有拥有window对象才能调用atob和btoa。因此,我们可以使用Services.jsm来获取窗口对象的引用吗?
答案 0 :(得分:1)
对于"平台"在你引用的段落中,它们指的是一组功能,它们不是严格的Firefox浏览器代码,而是实现基本的共享功能。这通常位于mozilla-central存储库中的toolkit/modules。 Services.jsm也存在于那里,是的,这是该平台的一部分。此外,atob
和btoa
都是从Services.jsm导入的。
=>
中的箭头exports.atob = a => atob(a);
定义了arrow function的内容:它是一种新的,更短的语法,用于在JavaScript中定义函数。 This SO答案有很多有用的信息。
根据我的理解,我们创建base64.js的原因是因为只有拥有window对象才能调用atob和btoa。因此,我们可以使用Services.jsm来获取窗口对象的引用吗?
这几乎是正确的:你需要从底层平台导出函数,因为那里没有窗口对象。如果你有一个窗口对象,你就可以完成window.atob
或类似的事情。该调用仍将调用您从Services.jsm导入的相同函数。
因此,您并未使用Services.jsm来获取对窗口对象的引用,而是直接导入所需的函数,以便您不需要拥有窗口对象。