关于 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。它将声明和调用打包到一个表达式中,并且不会留下不再使用的函数。
我是 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。它将声明和调用打包到一个表达式中,并且不会留下不再使用的函数。