看官方教程
grant介绍,none与unsafeWindow
沙盒机制的前世今生
或者网上搜索教程或者问AI
都说的头头是道,感觉似乎懂了,但一测试就懵逼了😳
这里汇总教程的大意是:
-
grant none 是脚本直接运行在前端页面中,此时可以访问页面中的原有变量,可以访问页面元素,但不能访问GM_*系列函数
-
默认(即无none和unsafeWindow的情况下),运行在沙盒中,无法访问页面中的原有变量,可以访问页面元素,可以访问GM_*系列函数
-
grant unsafeWindow是运行在沙盒中,可以通过unsafeWindow访问页面中的原有变量,可以访问页面元素,可以访问GM_*系列函数
总结如下:

但,我测试下来,却完全不是这样,什么默认,grant none,grant unsafeWindow效果完全一样。
以下是测试代码:
网页代码如下
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<div id="dom1">dom 1</div>
<button id="closePage">关闭页面</button>
<script>
var a=1;
window.b=2;
c=3;
let d=4;
const e = 5;
</script>
</body>
</html>
在线地址 https://wilson.lovestoblog.com/demo/scriptcat_demo.html
油猴代码如下
// ==UserScript==
// @name Demo
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description try to take over the world!
// @author You
// @match *://*/*
// ==/UserScript==
console.log('---> demoooooooooooooooooooo start <---')
console.log('变量', {a,b,c,d,e});
console.log('dom', document.querySelector('#dom1'));
document.querySelector('#closePage').addEventListener('click', ()=>window.close());
console.log('---> demoooooooooooooooooooo end <---')
注意,这里div id 是 dom1 不是demo1,别看错了!
浏览器打印结果(无论默认,grant none,grant unsafeWindow效果完全一样)

所以,我的疑惑是:我理解错了吗?还是测试错了?还是教程错了? 懵逼。。。