闭包学习

闭包是个什么鬼?

一般他们都用一个返回函数的例子。有啥意思呢?这个闭包有啥用呢?

还看到一个说法是闭包是一种软件工程里面的方法,个么就很有意思了,既然是方法,那基本每个语言都有这个功能吧。果然,一查,不仅javascript,python,C++都有闭包这么个概念。网上都能查到。而且python跟javascript比较像。所以这就有点好玩了。

我在python中写的一个闭包的例子。是以wikipedia上一个闭包的典型作为参考的:


def startAt(x):
	print x
	def incrementBy(y):
		print x,y		
		return x+y
	return incrementBy

f1 = startAt(1)
f1(3)
f1(4)

f2 = startAt(5)
f2(7)	
输出是:

1
1 3
1 4
5
5 7
​也就是说在f1定义的时候,外层的startAt函数被线处理了。之后的调用只有里面incrementBy的y是被修改的。

先从python中用lambda函数举得例子:

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]​

这个用list中第二个参数作为排序的依据。这个写法就很有特色。至少是我在查了半天的闭包功能举例中最有用的。(比那些单独返回一个函数的来说)个么可以确定的是闭包是一种可以用来简化程序的方法。

然后我看到过一个这么一个闭包的用法。他是用来写html上一种特定格式:...如果每次我都要在...输入不同内容,然后lambda就可以再不声明函数的情况下直接完成这个任务:

f = lambda x:'<>'+x+'<>'
f('1')

个么看来lambda(闭包)只是一个简化​代码的方法。这tm并没什么用好么!!!!!(其实还蛮好用的,这样可以让一些重复的函数操作通过函数闭包来完成)

然后python还有一个修饰器@,可以用来简化闭包的写法。。真是为了偷懒啊。。还看到一个例子用修饰器(​其实就是闭包)做了一个函数即时的功能。其主要目的就是再声明函数的时候用上@加那个计时的函数,这样每次只要专注于写函数本身就行了。

对于这个解释我是信服的。看来闭包还是有那么点点用的。

但是问题又来了。同样是编程语言为什么javascript中闭包那么重要。我写了很久python也没觉得必须要闭包呀。甚至学C++的时候都不说闭包这么回事。为啥?

然后我看到乐一片文章,让我豁然开朗。javascript没有类。闭包就是用来完成C++中类的功能。精辟。

首先从语言来看,C++是类为一等公民。python和javascript都是函数为一等公民。但是python还是能定义类,javascript不行。

从闭包本身来看,​再python中,就是把函数作为参数返回。有一个说法是,原本是把函数和参数独立分开看的。函数只是计算参数,输出才能传递。函数不行。这是再学C++时候的一个潜意识。我也有这么个意识。但是实际中,函数也是一段代码也是一串数据。可以传递啊,而闭包好像就是给传递这个函数的数据的时候保留了一个环境(也就是一些运行参数)。这就是为啥闭包的基本例子都会有一个可以传入的数。再函数运行的时候有些参数起始是函数本身可以携带的。很多关于闭包的文章都说到这么一点。什么会增加数据量拉。什么环境啦。

不过慢着,函数执行时候的环境变量,C++类里面的private参数算不算?

其实这里已经可以看出来了。由于javascript没有类,所以再声明一些函数的时候又希望他有一些可以跟着函数走的参量。所以就得用闭包来完成这个任务。因为javascript没有类。而python有类,所以这个功能可以用类实现嘛。所以用不用没啥关系。牛人可以用闭包简化代码。回到C++,我就是主要提倡用类的。那你还用闭包这个重复功能干嘛?

(所以那篇文章中说闭包是软件工程中的一个方法,这句话实在是画龙点睛)

所以总而言之,闭包是javascript在需要完成一些类函数所具有的功能的一个办法。

闭包是将函数视为数据的一个方式。让函数可以直接传递。并且让函数内部的一些参数再函数外面可见。当然这样我觉得不太好。封装呢封装?

闭包可以简化代码的长度。(让自己觉得自己很牛!)


当然闭包肯定是有用的。​



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值