一文搞懂油猴(篡改猴)脚本中window和unsafeWindow的关系

发布时间 2023-08-16 23:18:32作者: zqdlly

先看第一段代码:特点是grant none

// ==UserScript==
// @name test
// @match https://1.1.1.1/
// @grant none
// ==/UserScript==
(function(win){
    console.log(window)
    console.log(win)
})(unsafeWindow);

执行结果:Uncaught (in promise) ReferenceError: unsafeWindow is not defined
因为根本没有声明unsafeWindow,所以报错.把unsafeWindow替换为window后,执行正常如下图.

再看第2段代码:特点是grant unsafeWindow

// ==UserScript==
// @name test
// @match https://1.1.1.1/
// @grant unsafeWindow
// ==/UserScript==
(function(win){
    console.log(window)
    console.log(win)
    console.log(window===win)
})(unsafeWindow);

执行结果如下:

可见,改为沙盒模式后,第一行输出的是油猴(篡改猴)扩展提供的"假窗口",第二行输出的才是真正的window,第三行则说明了二者根本不是一回事.

另外基于目前使用的油猴(篡改猴)v4.19.0补充3个小知识点:
1,GM_info无需授权就能使用;
2,把第二段代码中的@grant unsafeWindow换为任意的@grant GM_api,比如GM_log,GM_addStyle,...效果不变
3,关于标签页的GM_api应该这么授权:

// @grant GM.getTab
// @grant GM.saveTab
// @grant GM.getTabs