闭包是内部函数在其定义内部引用了内部变量,当一个函数执行完,内部变量又被新函数引用
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()//结果全部都是9,返回的函数又引用变量i;并没有立即执行,而是等到3个函数都返回时,引用的变量变化才能了3,返回都是9
function numberLog() {
for (var i = 1;i <= 10;i++) {
setTimeout(function () {
console.log(i)
}, 1000)
}
}
numberLog();//代码的执行速度很快,我们循环了十次,生成了十个 setTimeout(function(){console.log(i)}, 1000)
,当一秒钟过去了,i早就变成11了,所以最后就会输出10个11
所以在闭包里返回的函数不要引用任何循环变量,或者后续会发生很大变化的变量
如果一定要引用循环变量,方法是创建一个函数,用函数的参数绑定当前循环变量的当前值,无论以后参数怎么变,已经绑定到函数的变量不再改变
def count(): def f(j): //创建一个函数绑定当前循环变量的值 def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
function numberLog() { for (var i = 1;i <= 10;i++) { (function (count) { setTimeout(function () { return console.log(count) }, 1000) })(i) } } numberLog();
这个会在控制台上会输出1-10