闭包和变量作用域

基础基础基础基础基础!!!!,这是一个屡踩屡犯的坑,不只一次了...

先来个例子:

闭包和变量作用域_第1张图片
例1

很简单的,执行后依次打印1, 2, 3, 4, 5. 再增加匿名函数

闭包和变量作用域_第2张图片
例2 

在匿名函数里打印 n 值,执行后一次打印1, 2, 3, 4, 5. 我的使用场景很简单,广告有很多过滤插件,很多可以复用同一个struct, 只是根据name来区分。过滤条件要在一个全局map里进行注册,以供后续使用,逻辑类似例3:

闭包和变量作用域_第3张图片
例3

代码逻辑比较清晰,执行后确发现输出是5, 5, 5, 5, 5 ......

其实原理很简单,和python的也很像,闭包是惰性的生成fn时 n 是在for 循环外层的,等执行fn时 n 早已经变成5了。修复起来很简单,n 以传参的形式给fn,或是for循环内部生成一个临时对象拷贝n值。

闭包和变量作用域_第4张图片
例4

你可能感兴趣的:(闭包和变量作用域)