闭包是什么?
闭包就是能够读取其他函数内部变量的函数,
或者简单的说,就是在函数中再定义一个函数,
内部的函数引用了外部的函数的变量。
Python
>>> def add_list(*args): def add(): sum = 0 for n in args: sum += n return sum return add
相关参数和变量都保存在返回的函数
>>> f = add_list(1,2,3,4,5,6,7) >>> f() 28
闭包中内部函数始终使用外部变量的最终值,
引用的外部变量没有到最终值,内部函数不会返回
>>> def my_example(): L = [] for i in range(4): def add(): L.append(i) return i return L >>> my_example() []
执行过程是:不断循环,然而不执行内层def里面的语句
结果返回了[]
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
显示:
9 9 9
结果并不是1,4,9
理由也是因为i会改变
JavaScript
function compare(i) {
return function(o1, o2) {
return o1[i] - o2[i]
}
}
通过匿名函数创建闭包
创建的比较函数保存在下面的cmp中,
匿名函数作用域链就存在
所以闭包有可能占用内存过多
var cmp = compare(1) var result = cmp([1,2,3,4], [2,3,4,5]) console.log(result) > -1
JS闭包中使用匿名对象时,
this通常指向window