|
前几年学习JavaScript语言时,首次接触到闭包的概念,虽然有教程和案例,始终没有弄明白,也不知该怎么用,这个问题一直困惑了我好几年,这两年因高中信息技术推python语言,没想到在学习python语言时,意外把闭包问题给弄明白了,借博客留点心得。
闭包的应用场景,主要是装饰器的使用,可不修改原函数的情况下,给函数添加新功能代码,由于学习JavaScript没有进一步学习框架,一直没有使用需求,故一直不得其解。软件开发时,升级时有个原则,即开放封闭原则,意思是已经实现的代码是不允许修改的,但可以扩展!
回归主题,先看看关于闭包的概念,教科书大概这么说:在一个函数里面定义一个函数,并且返回内部函数,内部函数还调用了外部函数的变量,这就是闭包!怎么样,晕不晕!当时,看了一个选号器的例子,也一直没搞明白,这次终于明白了,下面举个例子来说明,学过函数的可以看下来,如果没学过函数,不用往下看了,哈哈!
首先,闭包是一种函数的应用,举个例子吧,如封装一个直线方程的函数(没什么实际意义,仅用来说明问题),我们知道直线方程y=a*x+b,假设a=10,b=20,现在封装一个函数,执行并返回10*x+20的值
def
line(x):
return 10*x+20
函数line功能相当与数学直线函数y=10*x+20
下面用闭包来写这个函数:
def
line_conf(a,b):
def line(x):
return
a*x+b
return line
用闭包的概念来给你解释下,绝对晕,按闭包的概念:在一个函数line_conf里面定义一个函数line,并且返回内部函数line,内部函数还调用了外部函数的变量,即a和b,这就是一个闭包,怎么样,晕吧!
下面换个说法后,我瞬间明白了闭包的意义,上面的代码,在函数line_conf内定义函数line,且函数line调用line_conf传入的参数a和b,注意这里函数line仅被定义,没有执行,然后line_conf函数立刻就将line函数return出来了,这样做的效果是相当于给函数line和变量a、b指定了一个独立的空间,这么说吧,原来那个line函数(前面那个10*x+20),a=10,b=20是写死的,而现在line和a、b被封闭在一个空间,随着传入不同的a、b,执行一次line_conf相当于制造一个函数,这样可以配置出不同的直线函数。
即执行line01=line_conf(10,20),line01得到的返回包括,一个line函数并a=10,b=20,相当于line01函数为y=10*x+20
再次执行line02=line_conf(10,40),line02得到的返回包括,一个line函数并a=10,b=40,相当于line02函数为y=10*x+40
这样用line_conf函数可以得到一系列的直线方程
你可以自己验证,如
Print(line01(10)) à 120
Print(line01(20)) à 220
Print(line01(30)) à 320
Print(line02(10)) à 140
Print(line02(20)) à 240
Print(line02(30)) à 340 |