函数本身也是一个对象 , 可以被其它的变量进行引用 , 作为对象返回
闭包在函数里面再定义一个函数, 里面的函数用到外面函数的变量, 这个函数及用到的变量称为闭包
里层函数可以轻松访问外层函数的变量 当函数重名时函数本质上也是一个对象,可以被任意指向, 如果有多处指向,后面指向的总是覆盖前面指向的
开放封闭原则开放 : 对外可以扩展开发
封闭: 已实现的代码不修改
装饰器实现了开放封闭的代码原则, 原有的代码不发生修改又能增加新的功能 ,从本质上讲是将函数作为对象进行参数传递,并且作为对象进行返回
使用语法糖来简化代码使用@装修函数 的语法装饰函数 , 原函数的代码 和调用不发生变化
如下, 第一次装饰时函数并不没有执行,到第二次装饰里将第一次添加的功能添加将执行,所以被装饰函数执行了一次,简化言之:第二次装饰时 inner = func
不定参数的装饰器 带有返回值的装饰器 装饰器带有参数带有参数的装饰并不会直接传入原有的函数对象,而是返回一个被包裹的装饰器