Является ли хорошей практикой обертывание строгого режима внутри выражения IIFE (самовызывающегося)?

У меня есть один очень простой вопрос:
Хорошо ли заключать код в IIFE всякий раз, когда я собираюсь использовать "use strict"?


Теперь я понимаю полезность Scope Closure (ответил здесь и здесь) или, возможно, еще лучше, о полезности популярного модульного подхода к проектированию и о том, почему IIFE является таким мощным инструментом, который можно использовать (и не только) в этих сценариях, но это не о чем этот вопрос.

Я заметил, что большинство линтеров (включая jsfiddle) имеют тенденцию жаловаться всякий раз, когда вы хотите использовать строгий режим в глобальной области видимости:

введите здесь описание изображения

Обертывание блока внутри IIFE, похоже, предотвращает жалобы линтера.

(function(){
	"use strict";
	console.log("I compiled!");
})();

Есть ли какое-либо основание, почему use strict; следует хранить внутри IIFE, или это просто "необоснованное возражение", выдвинутое без надлежащей причины?


person Samuel Hulla    schedule 03.08.2018    source источник
comment
IIRC «использует строгий», поскольку объявление верхнего уровня делает все строгим и может нарушать сторонние сценарии.   -  person Jared Smith    schedule 03.08.2018
comment
@JaredSmith ... если эти сторонние сценарии объединены вместе с одним из ваших сценариев, в котором используется строгий режим (если сценарий, использующий строгий режим, появляется перед сторонним сценарием.)   -  person Nisarg    schedule 03.08.2018


Ответы (2)


Если несколько скриптов объединены в один файл, один "use strict"; вверху делает весь код скрипта в этом файле строгим, что может вызвать проблемы для некоторых скриптов, если они не разработаны. работать в строгом режиме. (Это не проблема, если они включены разными тегами script, только если они объединены.)

Является ли хорошей практикой обертывание кода внутри IIFE всякий раз, когда я намереваюсь использовать "use strict" ?

Если вы используете упаковщик, возможно. Если нет, то это не имеет большого значения. Тем не менее, по мере того, как модули в ES2015 становятся все более хорошо поддерживаемыми, использование модулей (что сегодня можно сделать с помощью сборщиков) будет еще лучшим выбором, и директива "use strict" вообще не нужна (ES2015+ код модуля всегда строгий).

person T.J. Crowder    schedule 03.08.2018

Я думаю, это потому, что когда use strict определяется глобально, вы в конечном итоге заставите все ваши сторонние ссылки не работать должным образом, если они также не будут строгими. Теперь, поскольку у вас нет возможности гарантировать, что все загруженные ресурсы будут использоваться строго, вы рискуете вызвать проблемы...

Использование «строгого» внутри области означает, что владелец области несет ответственность за то, поддерживает ли его код строгую или нет.

person MKougiouris    schedule 03.08.2018