2016-05-23 4 views
13

В ES5, писать такой код был рассмотрен в качестве хорошей практики:Нужно ли обертывать код ES6 в IIFE?

(function() { 
    //some magic 
})(); 

Но в ES6 переменных, созданных с помощью ключевого слова let не привязаны к window объекта.

Итак, есть ли необходимость в написании нашего кода в IIFE, или у него все еще есть некоторые цели, о которых я не слышал?

+0

Связанный: [Namespacing with IIFE in ES6?] (Http://stackoverflow.com/questions/32746615/namespacing-with-iife-in-es6) –

+1

См. Также [Будет const и пусть шаблон IIFE не нужен? ] (http://stackoverflow.com/q/33534485/1048572) – Bergi

+0

«* переменные, созданные с помощью ключевого слова' let', не привязаны к объекту 'window' *, но они все еще глобальны. Поэтому, если вы пишете скрипты, вам нужно будет поместить их в блок или IIFE. – Bergi

ответ

5

Если вы используете модули, нет необходимости использовать IIFE (так называется эта «обертка»), потому что все переменные имеют область действия, ограниченную модулем.

Однако все же есть некоторые случаи, когда вы хотите отделить одну часть кода от другой, а затем вы можете использовать IIFE.

Конечно, если вы используете let или const, вы можете использовать блок заявление вместо IIFE:

{ 
    let something = 1; 
    const somethingElse = 2; 
} 
console.log(something); // ReferenceError: something is not defined 

См родственный вопрос о Programmers.SE: How far should encapsulation in JavaScript go?.

+0

Как я понимаю, класс ES6 по существу предлагает те же самые или почти те же функции, что и IIFE. Это верно? – lux

+0

@lux Нет, классы ES6 различны. –

+0

'this' инкапсулирован в классе, нет? – lux

4

Теперь это проблема, но я бы сказал, что по этой общей идее все еще есть причина.

Теоретически можно, скажем, какой-либо библиотеки третьей стороной писать код, как это следующим образом:

let count = 0; 
function getCount() { 
    return count++; 
} 

Теперь, если вы пытались создать свою собственную count переменную в той же области, вы» d получает сообщение об ошибке:

// 3rd-party 
 
let count = 0; 
 
function getCount() { 
 
    return count++; 
 
} 
 

 
// Your code 
 
let count = 1;

Однако, вы можете сделать чистый код, используя фактические Ли cks вместо IIFE.

// Still bad 3rd party 
 
let count = 0; 
 
function getCount() { 
 
    return count++; 
 
} 
 

 
// Your code 
 
{ 
 
    let count = 10; 
 
    console.log(count); 
 
    console.log(getCount()); 
 
    console.log(count); 
 
    console.log(getCount()); 
 
}

В будущем, вы должны быть в состоянии инкапсулировать код в модулях, которые будут иметь свои собственные рамки, и вы не должны обернуть свой код в IIFE или блока.

+0

Как лексическое определение области ES6 влияет на это? – lux

+0

@lux То же, что и в последнем примере. Любые переменные, объявленные в другой области (включая методы в классе), будут теневыми переменными во внешней области, не пытаясь переопределить исходную переменную. Аналогично, если вы попытаетесь объявить класс с именем X в области, которая уже имеет другой класс или любую другую переменную, которая называется X, тогда вы столкнетесь с ошибкой переопределения. –

Смежные вопросы