Javascript 我们需要在生活中包装ES6代码吗?

Javascript 我们需要在生活中包装ES6代码吗?,javascript,ecmascript-6,encapsulation,iife,Javascript,Ecmascript 6,Encapsulation,Iife,在ES5中,编写此类代码被视为良好实践: (function () { //some magic })(); 但是在ES6中,使用let关键字创建的变量不会附加到window对象 那么,现在是否需要在IIFE中编写代码,或者它还有一些我没有听说过的用途?如果您使用的是模块,那么就不需要使用IIFE(这就是这个“包装器”的调用方式),因为所有变量的作用域都限制在模块内 但是,仍然有一些情况下,您需要将代码的一部分与另一部分分离,然后可以使用IIFE 当然,如果您使用的是let或const

在ES5中,编写此类代码被视为良好实践:

(function () {
    //some magic
})();
但是在ES6中,使用
let
关键字创建的变量不会附加到
window
对象


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

如果您使用的是模块,那么就不需要使用IIFE(这就是这个“包装器”的调用方式),因为所有变量的作用域都限制在模块内

但是,仍然有一些情况下,您需要将代码的一部分与另一部分分离,然后可以使用IIFE

当然,如果您使用的是
let
const
,则可以使用block语句代替IIFE:

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

请参阅程序员的相关问题。SE:。

现在问题不那么严重了,但我认为这一总体想法仍然有其原因

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

let count = 0;
function getCount() {
  return count++;
}
现在,如果您试图在同一范围内创建自己的
count
变量,您会得到一个错误:

//第三方
让计数=0;
函数getCount(){
返回计数++;
}
//你的代码

让计数=1相关:另请参见“使用
let
关键字创建的变量未附加到
窗口
对象”-但它们仍然是全局变量。所以如果你在写脚本,你需要把它们放在一个块或一个生命中。@Bergi这个问题不是重复了你链接的问题吗?@Gothdo:也许吧,但我不确定对const+let的关注是否会使它们有所不同,所以我不想愚弄hammer。请随意投票;如果OP同意,我会很高兴地关闭。据我所知,ES6类基本上提供了与IIFE相同或接近相同的功能。正确吗?@lux否,ES6类不同。
封装在类中,否?@lux此问题与类无关。如果你想讨论这个问题,可以问另一个问题,或者直接问我。@lux:不,类没有封装任何内容。在方法定义上,它们与对象文字一样好。ES6类中的词法范围如何影响这一点?@lux与上一个示例中的相同。在不同作用域中声明的任何变量(包括类中的方法)都将在外部作用域中隐藏变量,而不尝试重新定义原始变量。同样,如果您试图在已经有另一个名为X的类或任何其他变量的作用域中声明名为X的类,那么您将遇到重新定义错误。