关于闭包中变量共享的问题
书上说最后调用constfuncs()后i=10,由于i在闭包中是被共享的,所以所有的数组值都是10。我不明白为什么会是10呢?funcs[]的0到9的索引不是已经赋值结束了吗?即使i等于10也没有被赋值啊?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
书上说最后调用constfuncs()后i=10,由于i在闭包中是被共享的,所以所有的数组值都是10。我不明白为什么会是10呢?funcs[]的0到9的索引不是已经赋值结束了吗?即使i等于10也没有被赋值啊?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
这个我已经知道了,然而怎么删掉问题?貌似,func那儿得到的是function的引用并不是值,所以会全部变成10。刚发完就发现了。
这是一个和闭包有关的问题~~~
这个循环过程及赋值没有问题,问题出在函数执行时,每一个函数体在声明时绑定的都是constfuncs中声明的变量i,
当funcs数组中的函数去执行时,会查找这个变量的值,这个值在constfuncs中的循环结束后其值为10
就我看,你是有两点不明白:
一个是i为10
另一个是为什么调用数组函数,结果都为10
第一个问题:i为10。循环没看明白吧,i为9的时候,循环还没有结束,只有i为10的时候,i<10是不成立的,终止循环。所以,终止循环时,i为10。
第二个问题,你也知道,数组函数返回的都是i,他是在调用的时候返回i,而不是直接在循环的时候定死了值。
所以,当i循环结束时,i已经为10了。然后,任你在什么时候调用数组里面的函数,其都是返回i,也就是10。
如果,要符合你的想法,也就是
arr[5]=5
arr[6]=6
...
这种,那在函数里面的写法就应该是这样:
for.....
arr[i]=i // 而不是func... return i
.....
最重要的是,其数组里面的每一个元素都是一个函数,且都返回i。你要知道的是,他不是在for循环的时候就调用了的函数,而是在for循环之后调用的,for循环之后,i已经为10了,所以,调用每一个数组函数,返回的值都是10