关于立即执行函数与闭包的问题

for(var i=0;i<10;i++){
  setTimeout((function(i){
        console.log(i);
  })(i),1000*i);
    
}


for(var i=0;i<10;i++){
  setTimeout((function(i){
      return function(){
               console.log(i);   
      }

  })(i),1000*i);
    
}

首先说明我知道这两个函数执行的结构 第一个是马上打印出0到9并没有延迟 第二个函数会延迟1秒按顺序打印出0-9
第二个例子我明白是 首先立即执行函数先执行 然后创建了一个函数作用域 把变量i值作为参数保留在这个上下文中 然后这个立即执行函数执行完返回一个匿名函数 这个匿名函数会被丢进异步队列中 循环十次 进入下一个tick 这时候匿名函数处于全局作用域 保留着立即执行函数的执行上下文 所以这时候打印i取得是立即执行上下文的i 我认为我的理解是没问题的

问题是第一个例子 我的理解是打印出0到9是因为立即执行函数打印出来的 这时候立即执行函数执行完毕返回underfined 所以理论上这时候并不会往异步队列中丢进去要执行的异步动作 这时候并不会产生闭包 因为没有对于立即执行函数的引用 但是我看有一些文章说这里也是因为闭包 请问我的理解思路那里出问题了吗 谢谢

阅读 2.6k
3 个回答

第一个例子函数都已经执行完了,不会产生闭包的

你用IIFE……setTimeout第一个参数是undefined了

你好,第二个函数结果是延迟1秒按顺序打印出0-9吧

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