我们需要在IIFE中包装ES6代码吗?

时间:2016-05-23 19:45:51

标签: javascript ecmascript-6 encapsulation iife

在ES5中,编写此类代码被认为是一种很好的做法:

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

但在ES6中,使用let关键字创建的变量未附加到window对象。

那么,现在是否需要在IIFE中编写我们的代码,或者它仍然有一些我没有听说过的目的?

2 个答案:

答案 0 :(得分:7)

如果您正在使用模块,那么就不需要使用IIFE(这是"包装器"如何调用),因为所有变量的范围都限于模块。

但是,在某些情况下,您仍希望将代码的一部分与另一部分分开,然后您可以使用IIFE。

当然,如果您使用letconst,则可以使用块语句代替IIFE:

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

请参阅有关Programmers.SE的相关问题:How far should encapsulation in JavaScript go?

答案 1 :(得分:4)

现在这不是一个问题,但我认为这个概念仍有理由。

理论上,例如,某些第三方库可能会编写如下代码:

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

现在,如果您尝试在同一范围内创建自己的count变量,则会出现错误:

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

// Your code
let count = 1;

但是,您可以使用实际块而不是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或块中。