Mar*_*377 6 javascript userscripts tampermonkey ecmascript-6 greasemonkey-4
我的问题非常类似于javascript中自执行函数的目的是什么?,但是它涉及用户脚本(特别是针对 GreaseMonkey)。
我看到有些用户脚本是用这种模式分发的,有些则不是。
具有 IIFE 模式的脚本示例:(来源)
// ==UserScript==
// (...)
// ==/UserScript==
(function(){
// if <condition>
document.location.href += '?sk=h_chr';
// ...
})();
Run Code Online (Sandbox Code Playgroud)
没有它的脚本示例:(来源)
// ==UserScript==
// (...)
// ==/UserScript==
window.location.href = "https://www.facebook.com/?sk=h_chr";
Run Code Online (Sandbox Code Playgroud)
此外,我还发现 TamperMonkey 的“新脚本”模板遵循它,而 GreaseMonkey 和 ViolentMonkey 的模板没有。
那么问题是,IIFE 模式在编写用户脚本时有用吗?
特别是,如果我的脚本处于strictmode,并且我使用let而不是var. 无论如何,据我所知,用户脚本中定义的函数和变量在全局页面范围内不可用。
谢谢。
一般来说,没有;IIFE 模式很少用于包装整个用户脚本(参见下面的边缘情况)。这是多年前一些引擎(简而言之)默认情况下不包装脚本的倒退。
事实上,如果你包含过时的@unwrap指令,脚本引擎现在都会忽略它。
以下是使用 IIFE 模式的一些原因:
strict在整个脚本的旧版本 Violentmonkey(2018 或更早版本)中强制执行模式的唯一方法。Parsing error: 'return' outside of function 警告:(1) 脚本范围return和 (2) 外部 LINTer。考虑这个测试脚本:
// ==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;
}
Run Code Online (Sandbox Code Playgroud)
在所有情况下,用户脚本都是作用域/包装的。该页面看不到代码,也看不到cantSeeMeInConsole.
请注意,脚本页面冲突仍可能在@grant none模式下发生。
其他隔离适用,具体取决于:(a) 用户脚本引擎、(b) 浏览器和 (c)@grant模式。
例如,使用 Greasemonkey 或更改授权模式会杀死页面查看canSomestimesSeeMe.
'use strict';像这样放置在顶部会将整个用户脚本切换到严格模式。在相关说明中,如果脚本不使用@run-at设置,则使用$(document).ready()或其速记没有意义。
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |