В общем, нет;шаблон IIFE редко полезен для обертывания всего пользовательского сценария (см. крайние случаи ниже).Это был возврат ко многим годам назад, когда некоторые движки (кратко) не переносили сценарии по умолчанию.
Фактически, если вы включите устаревшую директиву @unwrap
, все механизмы сценариев теперь будут игнорировать ее.
Вот несколько причин использовать шаблон IIFE:
- В настоящее время это единственный способ включить режим
strict
в Violentmonkey (только) для всего сценария.Но это упущение только для этого одного двигателя, и, надеюсь, скоро будет исправлено. - Это может подавить безвредное
Parsing error: 'return' outside of function
предупреждение , если вы используете ОБА: (1) Общий сценарий return
и (2) внешний LINTer.
Некоторые старые версии Greasemonkey также предупреждают об этом, хотя все еще работают отлично. - (я думал, что был случай с 3-м краем)Но был прерван и не могу вспомнить, что это было.)
Рассмотрим этот тестовый скрипт:
// ==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
.
Строгий режим:
- В Tampermonkey и Greasemonkey, размещение
'use strict';
вверху, как это, переводит весь пользовательский скрипт в строгий режим. - В некоторой степени ошибка в том, что этого не происходит в Violentmonkey.
- Кроме того, в расширенных настройках Tampermonkey вы можете установить для «строгого режима» значение [По умолчанию / Всегда / Отключено] для всехscripts.
В соответствующей заметке, если сценарий не использует настройки @run-at
, нет смысла использовать $(document).ready()
или его сокращение.