关于 IIFE 工作方式的困惑

The confusion about the way how IIFE works

我是 JavaScript 的初学者,对 IIFE 在 JavaScript 中的工作方式感到困惑。也就是说,我知道它基本上用于转义变量分配给全局变量以避免冲突。但事情是这样的,比如说,我们有这样的代码:

var number = 7;

(function() {
  var number = 7;
  alert(number);
})();
//In this code collision does not happen due to IIFE

但是如果我写:

var number = 7;

function num() {
  var number = 7;
  alert(number);
}

/*In this code there does not happen collisions and 
number variable is not assigned to the global scope as well. So, why use IIFE?*/
num();

立即调用的函数表达式 (IIFE) 有不止一种用途。您关注的是 IIFE 在其中声明变量(或任何其他 functions/methods)时不会污染全局范围。

使用 IIFE 做的另一件重要事情是它允许您的代码立即 运行 而不会受到其他人的代码干扰 。此外,IIFE 运行s 无需通过名称 调用可能存在于 global 范围内的函数

这里的关键是您的代码既不干扰全局范围内的事物,又不受外部影响,因为全局范围内的任何内容都可能被错误地覆盖。

...you are shielding your code from someone who may change your globals accidentally, or sometimes intentionally!

查看 Mastering IIFEs 上的这篇媒体文章了解更多信息。


更新

为什么你的第二个例子 可能 对某事产生负面影响的一个很好的例子是:

如果您导入某种库,并且它在全局范围内有一个名为 num 的方法(该库在内部使用)(因为它没有使用 IIFE),您的第二个示例会覆盖该方法,并使其在库中无法使用。

这里的关键是它不仅仅是范围界定。在任何方法中声明的变量都限定在该方法范围内,而不是全局范围。 但是命名函数在全局范围内。

你这是在制造大混乱。 IIFE 不影响局部变量和全局变量的工作方式。

关于全局变量和局部变量,您的两个示例之间没有区别。

都声明全局变量 number 并用 7 初始化它(在函数外)和一个同样命名为 number 并用 7 初始化的变量在函数里面。函数里面的变量"covers"全局的;全局变量 number 不能在函数内部使用(通过简单地使用 number 名称)并且 alert() 调用使用局部变量。

您可以使用这些代码变体轻松检查:

var number = 7;

(function() {
  var number = 6;
  alert('local variable: ' + number);
})();
alert('global variable: ' + number);

var number = 7;

function num() {
  var number = 6;
  alert('local variable: ' + number);
}
num();
alert('global variable: ' + number);

上面的两个代码片段几乎具有相同的效果。他们声明一个函数然后执行它。

唯一的区别是第二个在全局名称space.

中创建了一个名为num的函数

有时我们不想创建命名函数。例如,仅使用一次时。在这种情况下,当声明一个函数然后仅调用一次时,将使用 IIFE。它将声明和调用打包到一个表达式中,并且不会留下不再使用的函数。