我的理解是,iife可以让你模拟一个"私有"作用域,这样就可以防止全局作用域变得混乱。
现在,由于ECMAScript 6已经被广泛使用,并且通过const和let提供了块级作用域访问,是否还有其他原因使用iife模式呢?(除了需要向后兼容...)
我的理解是,iife可以让你模拟一个"私有"作用域,这样就可以防止全局作用域变得混乱。
现在,由于ECMAScript 6已经被广泛使用,并且通过const和let提供了块级作用域访问,是否还有其他原因使用iife模式呢?(除了需要向后兼容...)
const
,这是普通块无法实现的。例如:
const output = (() => {
// some calculations that take a few lines
const now = new Date();
return now.getMinutes() + ':' + now.getSeconds();
})();
console.log(output);
假设我们想要将now
变量封装在IIFE中,因为它仅与计算output
相关,而在其他地方不需要。如果使用普通块来实现这个目的,只有在使用let
而不是const
声明output
时才可能实现:
let output;
{
// some calculations that take a few lines
const now = new Date();
output = now.getMinutes() + ':' + now.getSeconds();
}
console.log(output);
const
明显提高了代码的可读性(在我看来),这可能是偏爱 IIFE 而不是普通块的潜在原因,当然,代码风格是有所不同的。function getTimeStr() {
const now = new Date();
return now.getMinutes() + ':' + now.getSeconds();
}
// another file:
// import getTimeStr from './getTimeStr';
const output = getTimeStr();
console.log(output);
const now = new Date(); const output = now.getMinutes() + ':' + now.getSeconds();
。当然,now
在其他地方没有用到,但谁在乎呢?它是const
类型,无论如何都不会被更改。这似乎不是使用IIFE的常见或有用的理由。为了隐藏一个临时变量而使代码复杂化,这并不合适。 - jfriend00await
:(async function() {
try {
const data1 = await something1();
const data2 = await something2(data1);
...
} catch(e) {
...
}
})();
return
或throw
来停止剩余代码的执行(而不是嵌套在一个if
中),或者当你想要递归调用某些东西时。但是,当然,你也可以通过本地作用域命名函数获得所有这些优点。
return
来提前停止执行。您还可以使用参数和参数别名周围的词法变量。函数还可以为调试命名程序。最后,您可以从内部递归/重新启动命名的 IIFE,而没有对块的引用。 - dandavis