Python/JS 闭包
闭包是什么?
闭包就是能够读取其他函数内部变量的函数,
或者简单的说,就是在函数中再定义一个函数,
内部的函数引用了外部的函数的变量。
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