gpt4 book ai didi

javascript - 编写用户脚本时是否真的需要立即调用函数表达式 (IIFE) 模式?

转载 作者:行者123 更新时间:2023-11-29 15:57:59 26 4
gpt4 key购买 nike

我的问题与 What is the purpose of a self executing function in javascript? 非常相似,但是它涉及用户脚本(专门针对 GreaseMonkey)。

我看到有些用户脚本以这种模式分发,有些则不是。

具有 IIFE 模式的脚本示例:(source)

// ==UserScript==
// (...)
// ==/UserScript==

(function(){
// if <condition>
document.location.href += '?sk=h_chr';
// ...
})();

没有它的脚本示例:(source)

// ==UserScript==
// (...)
// ==/UserScript==

window.location.href = "https://www.facebook.com/?sk=h_chr";

此外,我还发现TamperMonkey的“New script”模板遵循它,而GreaseMonkey和ViolentMonkey的模板则没有。

那么问题是,IIFE 模式在编写用户脚本时是否有用?

特别是,如果我的脚本在 strict mode 中,并且我使用 let 而不是 var。无论如何,据我所知,用户脚本中定义的函数和变量在全局页面范围内不可用。

谢谢。

最佳答案

一般来说,没有; IIFE 模式很少用于包装整个用户脚本(请参阅下面的边缘情况)。这是多年前的倒退,当时某些引擎(短暂地)默认情况下不包装脚本。

事实上,如果你包括过时的@unwrap directive ,脚本引擎现在都将忽略它。

以下是使用 IIFE 模式的一些原因:

  • 这是在旧版本的 Violentmonkey(2018 年或更早版本)中为整个脚本强制执行 strict 模式的唯一方法。
  • 它可以抑制无害 解析错误:'return' outside of function warning 如果您同时使用:(1) 一个脚本- wide 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 等变量。
当心 script page conflicts can still occur in @grant none mode.

脚本沙箱:

额外的隔离适用,具体取决于:(a) 用户脚本引擎,(b) 浏览器,以及 (c) @grant 模式。
例如,使用 Greasemonkey 或更改授权模式会破坏页面查看 canSomestimesSeeMe 的能力。

严格模式:

  • 'use strict'; 放在最上面,这样可以将整个用户脚本切换到严格模式。
  • 此外,在 Tampermonkey 的高级选项中,您可以将所有脚本的“严格模式”设置为 [默认/始终/禁用]。

在相关说明中,如果脚本不使用 @run-at 设置,则使用 $(document).ready() 或其速记。

关于javascript - 编写用户脚本时是否真的需要立即调用函数表达式 (IIFE) 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com