基础基础基础基础基础!!!!,这是一个屡踩屡犯的坑,不只一次了...
先来个例子:
![](https://img.haomeiwen.com/i659877/a2fb730399803f48.png)
很简单的,执行后依次打印1, 2, 3, 4, 5. 再增加匿名函数
![](https://img.haomeiwen.com/i659877/4e3465087234bdc1.png)
在匿名函数里打印 n 值,执行后一次打印1, 2, 3, 4, 5. 我的使用场景很简单,广告有很多过滤插件,很多可以复用同一个struct, 只是根据name来区分。过滤条件要在一个全局map里进行注册,以供后续使用,逻辑类似例3:
![](https://img.haomeiwen.com/i659877/8f91fd8c02d60fa2.png)
代码逻辑比较清晰,执行后确发现输出是5, 5, 5, 5, 5 ......
其实原理很简单,和python的也很像,闭包是惰性的生成fn时 n 是在for 循环外层的,等执行fn时 n 早已经变成5了。修复起来很简单,n 以传参的形式给fn,或是for循环内部生成一个临时对象拷贝n值。
![](https://img.haomeiwen.com/i659877/ba61791ce2be1ec8.png)
网友评论