关于IIFE能保持变量私有和污染全局变量的问题

在学习JS的IIFE的时候,看到很多教程都说IIFE可以保持变量的私有。例如

(function foo() {
  var b = 7;
})();
console.log(b); // referenceError

在函数外无法访问变量b。但是这里用正常的函数声明,不是也能达到同样的效果吗?

另外还看到有教程都说IIFE可以防止pollute global variables。比如

var b = 5;

(function foo() {
  var b = 7;
})();

console.log(b); // 5

但是正常的函数声明,不是也能达到同样的效果吗?

我不理解IIFE在这两个方面有比正常的函数声明有什么优势

阅读 3.3k
4 个回答
在学习JS的IIFE的时候,看到很多教程都说IIFE可以保持变量的私有。

这里要对比的是

var a = 1;
//和
(function foo() {
  var a = 1;
})();

而不是对比立即执行函数表达式函数声明或者函数表达式执行的区别,他并不是一个高阶函数,函数作用域都是一样的,他只是立即执行而已。

在楼主的代码里,IIFE避免污染了全局变量foo。
而直接声明会创建一个foo的全局变量。

关于私有变量的问题,其他回答已经非常精彩,就不再赘述了。

普通函数声明以后你得自己调用一次,另外这个函数本身也是相当于全局空间的变量,最后对于普通函数也是可以通过闭包是可以拿到函数里面的变量的

之前这个问题我在Stack Overflow上面看到过:
使用IIFE的好处有三个:

  1. 避免了在全局中使用命名空间。因为IIFE可以用匿名函数直接运行。楼主你可以把foo去掉直接运行。
  2. 使用IIFE是自运行的,而不需要你再次去调用,英文中说的是:self-documenting,。
  3. 普通命名函数,不是立即运行的,你可能会在某个地方错误调用它。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题