在ES5中,编写此类代码被认为是一种很好的做法:
(function () {
//some magic
})();
但在ES6中,使用let
关键字创建的变量未附加到window
对象。
那么,现在是否需要在IIFE中编写我们的代码,或者它仍然有一些我没有听说过的目的?
答案 0 :(得分:7)
如果您正在使用模块,那么就不需要使用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?。
答案 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或块中。