博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 经典闭包题目详解
阅读量:4969 次
发布时间:2019-06-12

本文共 1310 字,大约阅读时间需要 4 分钟。

function test () {  var arr = []  for (var i=0; i<10; i++) {    arr[i] = function () {      console.log(i)    }  }  return arr}var myArr = test()for (var j =0; j < 10; j ++) {  myArr[j]()  // 10个10}

要彻底理解这段代码 必须里面所有内容执行顺序都要清楚

我们看for循环的执行步骤

 

test函数执行之后给我们返回一个数组

var myArr = [  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},  function () {console.log(i)},]

 

我们循环调用10个函数

for (var j =0; j < 10; j ++) {  myArr[j]()}

 每个函数都执行了console.log(i)

我们要去函数所在的上下文,也就是这个函数所在的位置寻找这个i;

每个函数中没有i 就去函数的外层寻找;

通过10次循环自增,此时的i也就是10

所以打印10个10

这个闭包问题的关键:

  1.函数不是立即执行的,所以无法立刻拿到 i 的值,也就无法正确的显示 i 

     2. 理解for循环,正确的拿到 i 的值

 

如何解决这个闭包问题,拿到我们想要的值

  函数虽然不是立即执行的,但是我们可以让这个函数能够正确的读取到 i 的值

function test () {  var arr = []  for (var i=0; i<10; i++) {    (function (j) {
arr[j] = function () { console.log(j) } } (i)) } return arr}var myArr = test()for (var j =0; j < 10; j ++) { myArr[j]()}

  通过理解立即执行函数  将j存在立即执行函数中,也就是函数 function(){console.log(j)} 的外层

  当我们访问这个函数function(){console.log(j)} 的时候 就能通过函数的作用域得到j的值

  

 

 

                

转载于:https://www.cnblogs.com/guozongzhang/p/11046203.html

你可能感兴趣的文章
libmidas.so.2
查看>>
开发WINDOWS服务程序
查看>>
httpencode编码
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
DELPHI搭建centos开发环境
查看>>
IdHTTPServer允许跨域访问
查看>>
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
React躬行记(13)——React Router
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(2)——Babel
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Windows server 2008 R2中安装MySQL !
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
linux 命令之top
查看>>
洛谷 [P3033] 牛的障碍
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>