const 和 let 会使 IIFE 模式变得不必要吗?

IT技术 javascript scope ecmascript-6 hoisting
2021-02-01 03:09:15

据我了解,IIFE 模式是解决 ES5 及以下无法创建块作用域这一事实的方法。通过将所有内容包装在一个函数中并立即调用它,我们可以创建一个作用域。

现在,let并且const将获得更多浏览器的支持,这是否减少了对 IIFE 模式之类的需求?

3个回答

是的,块要更换IEFEs,一旦块范围的声明(功能let/ const/class)被广泛采用。您需要一个范围,例如用于关闭?这里有一个块,可以是循环体,也可以只是语句列表的一部分。

但是,IEFE 仍然有一个应用程序块无法替代:module模式。块没有返回值,并且改变更高范围的变量是丑陋的,所以我们仍然会在需要私有状态的对象的创建中看到函数表达式:

const example = (() => {
    …
    return …;
}());
没关系,现在我看到你需要"use strict"在块的范围之外。这很有帮助。谢谢!
2021-03-14 03:09:15
@Esteban:很好的反对意见。但是 ES6 module通常需要一个自己的文件,您可能不想将代码分散得太远。
2021-03-20 03:09:15
letconstclass都在块作用域内,但function不是,并且会泄漏到块作用域之外。如果您要声明函数,则仍然需要 IIFE。
2021-03-26 03:09:15
@Bergi 这是在 Chrome 中错误地实现的吗?在 Chrome 58 中试试这个代码: gist.github.com/rgeraldporter/3f94db1d0b5515789c9675cb659b7cc3 声明严格似乎也没有帮助。( let, const,class虽然所有块作用域都正确)
2021-03-26 03:09:15
您将使用 ES2015 module来维护私有状态和代码。也就是说,当浏览器支持它们时:(
2021-04-10 03:09:15

尽管浏览器可能开始支持此功能,但总会有一些随机浏览器已过时或不打算对此提供支持。在它成为所有主要浏览器的标准之前,仍然建议您继续使用您的 IIFE 模式,直到在所有主要使用的浏览器上找到它为止。你可以做的是让一个脚本(或谷歌分析)发送关于这是否未定义的信息,直到你得到至少大约 90% 的信息说它不是未定义的,你应该继续使用 IIFE。

是的,非常值得推荐使用const以及letES6 的所有新功能。目前可能并非所有浏览器都支持它,但您可以在应用程序中使用像 babel 这样的编译器来确保它们可以在任何地方工作。

你没有解释你的论点,也没有真正解决这个问题。const与范围无关。ES2015 module与名称间距的关系远不止const(并且将所有内容都包装在一个块中并let在任何地方使用仅用于范围界定对我来说似乎是 hack-ish)。
2021-03-27 03:09:15
@MasterAMconst与作用域同样相关let:它们都是块作用域。参考资料:mdn 2ality
2021-03-29 03:09:15