我是JavaScript的初学者,在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();
发布于 2019-05-10 06:35:45
立即调用的函数表达式(IIFE)有多个用途。您关注的问题是,在声明变量(或任何其他函数/方法)时,IIFE不会污染全局范围。
另一件重要的事情是使用IIFE可以让您的代码立即运行,而不需要其他人的代码干扰。此外,IIFE运行时无需调用函数的名称为,该函数可能存在于全局范围内。
这里的关键是您的代码都是:不干扰全局范围内的事物,并且不受外部影响,因为全局范围中的任何内容都可能被错误地覆盖。
...you正在屏蔽您的代码,以免有人意外地或有意地更改您的全局!
查看这篇关于掌握IIFE的媒体文章以获得更多信息。
更新
第二个例子可能对某些事情产生负面影响的一个很好的例子是:
如果您导入了某种库,并且它在全局范围内有一个名为num (库内部使用的方法)的方法(因为它没有使用IIFE),那么第二个示例将覆盖该方法,并使它在库中不可用。
这里的关键是,它不仅仅是范围界定。在任何方法中声明的变量的作用域都是该方法,而不是全局范围。,但命名函数在全局范围内.
发布于 2019-05-10 06:45:41
你搞得很混乱。生命并不影响局部变量和全局变量的工作方式。
关于全局变量和局部变量,您的两个示例没有区别。
两个变量都声明全局变量number,并使用7 (函数外部)和一个变量(也称为number )初始化它,并在函数中使用7进行初始化。函数中的变量“覆盖”全局变量;全局变量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);
上面的两个代码片段具有几乎相同的效果。他们声明一个函数,然后执行它。
唯一的区别是,第二个函数在全局名称空间中创建一个名为num的函数。
有时我们不想创建一个命名的函数。例如,当它只使用一次时。在这种情况下,当一个函数被声明,然后只被调用一次时,就会使用一个生命周期。它将声明和调用打包到一个表达式中,并且不会留下不再使用的函数。
https://stackoverflow.com/questions/56071719
复制相似问题