IIFE主要用于封装范围
(function () {
let myVar = 10; // not global
// ...
}());
但是为什么不只使用block语句呢?
{
let myVar = 10; // also not global
// ...
}
除了作用域封装,使用IIFE还有其他好处吗?
答案 0 :(得分:1)
IIFEs利用了功能范围。用var
声明的函数和变量在父函数范围内。
Block statements利用了块范围。用let
和const
声明的变量在该块内作用域。
Block语句不封装用var
声明的函数或变量。
答案 1 :(得分:1)
Block语句是最新功能。是的,在引入之前,通常使用IIFE。
如今,我至少可以想到一种无法替代IIFE的情况。看这个:
(async () => { const foo = await someAsyncFunction() })()
看到了吗? await
关键字只能存在于async
函数中,因此,如果您的await
包含的表达式尚未被任何函数包装,则必须通过异步IIFE对其进行包装。
答案 2 :(得分:0)
试试这个你会更好地理解这个概念:
if(true){
var something = 'something' // This is global now. Block scoping for var works fine inside function definition but not for **if statements** or similar ones
}
console.log(something)
尝试将 var 更改为 let,您将无法访问 console.log 语句中的某些内容。