一般来说,没有;IIFE 模式很少用于包装整个用户脚本(请参阅下面的边缘案例)。这是多年前的倒退,当时某些引擎(简要地)默认情况下不包装脚本。
事实上,如果你包含了 obsolete @unwrap
directive,脚本引擎现在都会忽略它。
以下是使用 IIFE 模式的一些原因:
strict
这是在旧版本的 Violentmonkey(2018 或更早版本)中为整个脚本强制执行模式的唯一方法。
- 如果您同时使用这两种方法,它可以消除无害的
Parsing error: 'return' outside of function
警告:(1) 脚本范围return
和 (2) 外部 LINTer。
一些旧的 Greasemonkey 版本也会对此发出警告,同时仍然可以正常工作。
- (我以为有第三种边缘情况。但被打断了,不记得是什么了。)
考虑这个测试脚本:
// ==UserScript==
// @name _Scope and Strict-Mode Demo script
// @match https://stackoverflow.com/*
// @unwrap
// @grant none
// ==/UserScript==
/* eslint-disable no-multi-spaces, curly */
'use strict';
if (location.pathname.includes("/users/") ) {
console.log ("Terminating script early.");
return; // In external LINTers, this will cause a harmless warning.
}
var cantSeeMeInConsole = "neener neener";
window.canSomestimesSeeMe = "Howdy";
console.log (`In Strict mode: ${bInStrictMode() }; \`cantSeeMeInConsole\`: ${cantSeeMeInConsole}`);
function bInStrictMode () {
var inStrict = false;
var dummyObj = {};
Object.defineProperty (dummyObj, 'foo', {value: "bar", writable: false } );
try { dummyObj.foo = "fee"; }
catch (e) { inStrict = true; }
return inStrict;
}
- 在 Firefox 和 Chrome 上运行。
- Safari 和 Opera 应该给出相同的结果。
- Microsoft Edge可能会给出相同的结果。(但如果没有,我并不在意。)
- 使用 Tampermonkey、Violentmonkey 和 Greasemonkey 4 运行。
脚本范围:
在所有情况下,用户脚本都是作用域/包装的。该页面看不到代码,也看不到cantSeeMeInConsole
.
请注意,脚本页面冲突仍可能在@grant none
模式下发生。
脚本沙盒:
额外的隔离应用取决于:(a) 用户脚本引擎,(b) 浏览器,和 (c)@grant
模式。
例如,使用 Greasemonkey 或更改授权模式会导致页面无法查看canSomestimesSeeMe
.
严格模式:
- 像这样放置
'use strict';
顶部会将整个用户脚本切换到严格模式。
- 此外,在 Tampermonkey 的高级选项中,您可以将所有脚本的“严格模式”设置为 [Default/Always/Disabled]。
在相关说明中,如果脚本不使用@run-at
设置,则使用$(document).ready()
或它的简写没有意义。