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

posted @ 2018-06-04 18:50  弱冠  阅读(258)  评论(0编辑  收藏  举报