IIFE算是闭包吗?

为什么我总觉得IIFE只是简单的函数调用,没有闭包啊
下面的代码哪有闭包啊

for(var i=0; i<5; ++i){
(function foo(j){  
    setTimeOut(function foo1(){ console.log(j) }, 1000 ) 
    })(i)
}
阅读 6k
3 个回答

闭包和IIFE没关系,如果用IIFE实现了作用域和函数的组合(比如return了函数)就有闭包,反之就没有。
这里是MDN的解释Closures
闭包

var myFunc = (function makeFunc() {
  var name = 'Mozilla';
  function displayName() {
    alert(name);
  }
  return displayName;
})();
myFunc();

没有闭包

(function makeFunc() {
  var name = 'Mozilla';
  function displayName() {
    alert(name);
  }
  displayName();
})();

我觉得闭包的特征在于是否利用函数进行跨作用域操作,保留其他作用域中的变量。

因为配合闭包用的多呀, 你这个代码明显有闭包呀,里面 j 不用里面foo函数把值存起来,你能在setTimeout后打印出来0,1,2,3,4?

严格来讲IIFE并不算闭包,因为函数并没用在本身的词法作用域以外执行。
你这里的IIFE是创建了一个闭包的“包”的作用域。
其中你的代码中foo1函数是闭包。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题