定义:多层函数嵌套(一般为两个),而且通常内部函数需要用到外部函数的变量,那么就把内部函数和外部函数中的那些变量值 叫做闭包。
定义有些抽象,来看例子。如果想实现设计一个一元一次函数,其中斜率k,截距b和变量x 都是需要用户自定义。
程序如上,当执行这个程序的时候,编译器首先会跳到 line_1 = line(1,2) 这行,随后程序会找到 def line(k,b)这行,再继续到def creat_y(x)这行,
此时,程序不会执行内层函数中的内容,因为函数只有在被调用的时候才会执行,所以程序执行到def creat_y(x)这行时什么也不会做,直接跳到return creat_y【注意这里没有小括号】。
此时返回了函数的指向,而不会函数的值。也就是说程序从开始运行到现在返回的结果是 内层函数creat_y的指向。
而creat_y指向了计算机内存中的一块空间,这块空间中有实参k b和形参x 以及函数creat_y里面的内容【红框里面的东西】。
所以,当最开始执行line_ = line(1,2)这行时,结果就是line_1指向了红框这个空间,而这个空间中只有x一个形参,k和b都是作为实参从外部函数中被传入到内层函数中去了。
后面三行,在调用line_1时传入的参数(0,1,2)就是传给红框空间中的x。
思考:函数、匿名函数、闭包、对象,当作实参时,有什么区别
1、匿名函数能够完成基本的简单功能,传递的是这个函数的引用,只有功能。
2、普通函数能够完成较为复杂的功能,传递的是这个函数的引用,只有功能。
3、闭包能够完成较为复杂的功能,传递的是这个闭包中的函数以及数据,因此传递的是功能+数据。
4、对象能够完成最为复杂的功能,传递的是很多数据+很多功能,因此传递的是功能+数据。