1.闭包(closure) : 闭包的目的是 读取 其余函数内部变量,因为正常函数执行后都会进行弹栈,从而再也不保存临时变量,所以闭包 会使函数的临时变量永久的保存在内存中。javascript
定义一个函数,函数内容执行过程,会把函数中变量放在堆内存,或栈内存中,一旦整个函数执行结束,栈内存弹出,堆内存等待垃圾回收,执行后没法访问临时变量,而闭包能够访问临时变量,java
2.经过内部函数才能访问函数的变量,所以全部闭包的实现方式都是经过内部函数的方式实现。闭包
目的:读取当前函数在执行过程当中的临时变量的值函数
3.闭包会致使函数执行过程当中内存不会释放,要注意使用场景与频繁程度。spa
获取函数临时变量的值code
1. 用返回 return对象
<script> function fun(){ var obj = { name :"zhangsan" } return obj; } var a = fun(); console.log(a); </script>
2. 定义一个全局函数ip
function fun(){ var obj = { name :"zhangsan" }; //此时inner至关于全局函数,至关于在window里面加了一个inner属性, //inner属性对应的值为 function, 返回当前临时变量obj inner = function (){ return obj; } }; //fun() //第一步要先调用 fun() fun(); //已经加载 全局函数 inner()到 window环境; var ob =inner(); console.log(ob.name);
经过在函数体内设置一个 全局function 获取函数内临时变量的值---全局变量函数,对局部变量对象 obj进行了引用,js识别 obj 被占用-----就不会弹栈,因此每次执行inner时能够访问,------但形成obj不弹栈--不知道何时会调用,形成内存浪费内存
3.定义一个内部函数,并返回io
function fun(){ var obj = { name :"zhangsan" }; //对于当前内部函数来讲 ret有访问内部对象的权利 function ret(){ return obj; } return ret ; // ret没加()表明当前返回的是函数对象 }; var ret = fun(); //ret自己是一个函数 var obj = ret(); console.log(obj)
经过内部函数返回,ret()方法内访问obj对象,
var ret = fun(); //引用了 ret因此 ret 不会出栈 var obj = ret();