Будет ли const и пусть шаблон IIFE станет ненужным?

Насколько я понимаю, шаблон IIFE — это обходной путь к тому факту, что в ES5 и ниже нет возможности создавать блочные области. Обернув все в функцию и немедленно вызвав ее, мы можем создать область видимости.

Теперь, когда let и const получат поддержку большего количества браузеров, уменьшит ли это потребность в чем-то вроде шаблона IIFE?


person Kyle Pennell    schedule 05.11.2015    source источник
comment
Я вижу аргумент в пользу того, как можно использовать блок и let для замены IIFE, но какое отношение имеет const ко всему этому? IIFE обеспечивает конфиденциальность внутри области действия и позволяет избежать загрязнения пространства имен. const вообще не помогает с конфликтами пространств имен. Он обеспечивает защиту от записи, но не конфиденциальность при чтении.   -  person jfriend00    schedule 05.11.2015
comment
Взгляните на это: Выполните ES6 Модули делают IIFE устаревшими?   -  person Noam Manos    schedule 01.05.2017


Ответы (3)


Да, блоки заменят IEFE, как только объявления с блочной областью действия (функции, let/const/class) получили широкое распространение. Вам нужна область действия, например. на закрытие? Здесь у вас есть блок, будь то тело цикла или просто часть списка операторов.

Однако есть еще одно приложение IEFE, которое блоки не могут заменить: шаблон модуля. Блоки не имеют возвращаемых значений, а изменение переменных с более высокой областью действия выглядит уродливо, поэтому мы все равно увидим функциональные выражения при создании объектов, которым требуется приватное состояние:

const example = (() => {
    …
    return …;
}());
person Bergi    schedule 05.11.2015
comment
Вы должны использовать модули ES2015 для поддержания частного состояния и кода. То есть когда они поддерживаются браузерами :( - person Esteban; 06.11.2015
comment
@Esteban: Хорошее возражение. Но для модуля ES6 обычно требуется собственный файл, и вы, возможно, не захотите слишком распространять свой код. - person Bergi; 06.11.2015
comment
let, const и class ограничены рамками блоков, а function — нет, и будут просачиваться за пределы области блока. Если вы объявляете функции, IIFE по-прежнему необходим. - person Rob Porter; 22.02.2017
comment
Объявления функций @RobPorter также имеют блочную область действия в ES6 - проверьте вопрос, связанный с моим ответом. - person Bergi; 22.02.2017
comment
@Bergi, значит, это просто неправильно реализовано в Chrome? Попробуйте этот код в Chrome 58: gist.github.com/rgeraldporter/3f94db1d0b5515789c9675cb659b7cc3 вроде тоже не помогает. (Хотя let, const, class все области блока корректны) - person Rob Porter; 22.02.2017
comment
Неважно, теперь я вижу, что вам нужно иметь "use strict" вне области действия блока. Это очень помогает. Спасибо! - person Rob Porter; 22.02.2017

Хотя браузеры могут начать поддерживать это, всегда будет какой-то случайный браузер, который устарел или не планирует поддерживать это. до тех пор, пока он не станет стандартным для всех основных браузеров, рекомендуется продолжать использовать шаблон IIFE до тех пор, пока вы не найдете его во всех широко используемых браузерах. что-то, что вы могли бы сделать, это заставить скрипт (или аналитику Google) отправлять информацию о том, является ли это неопределенным или нет, и пока вы не получите по крайней мере около 90% этого, говорящего, что это не неопределенно, вы должны продолжить IIFE.

person puppy0cam    schedule 05.11.2015

Да, очень рекомендуется использовать const и let, а также все новые функции ES6. На данный момент он может поддерживаться не всеми браузерами, но вы можете просто использовать компиляторы, такие как babel, в своих приложениях, чтобы убедиться, что они будут работать везде.

person Ana Bastos    schedule 19.09.2016
comment
Вы не объяснили свои аргументы и не ответили на вопрос. const не относится к сфере действия. Модули ES2015 имеют гораздо больше общего с пространством имен, чем const (и обертывание всего в блок и использование let везде только для области видимости кажется мне хакерским). - person MasterAM; 19.09.2016
comment
@MasterAM const так же связан с областью действия, как и let: они оба имеют блочную область видимости. Ссылки: mdn 2ality - person Marcus; 02.02.2017