猿问

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

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 所以理论上这时候并不会往异步队列中丢进去要执行的异步动作 这时候并不会产生闭包 因为没有对于立即执行函数的引用 但是我看有一些文章说这里也是因为闭包 请问我的理解思路那里出问题了吗 谢谢


噜噜哒
浏览 447回答 3
3回答

有只小跳蛙

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

喵喵时光机

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

一只甜甜圈

你好,第二个函数结果是延迟1秒按顺序打印出0-9吧
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答