闭包函数
第一次注意到这个称谓,是在听到公司大佬和别人看代码的时候,虽然实际中我还没有运用过(可能用过,但自己不明所以,或者是复制的代码),所以记录一下自己百度下来的结果
闭包函数的定义:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包函数。
闭包是一种环境,具体是:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
闭包的特点
让外部访问函数内部变量成为可能;
局部变量会常驻在内存中;
可以避免使用全局变量,防止全局变量污染;
会造成内存泄漏(有一块内存空间被长期占用,而不被释放)
function func(){
var index = 0;
function add(){
Debug.Log(index++);
}
return add;
}
var Add = func();
Add();//1
Add();//2
Add();//3
var Add2 = func();//每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址
Add2();//1
Add2();//2
Add2();//3
其中方法func是外部函数,方法add为内部函数,也叫闭包函数。因为func返回的是一个方法,所以将其赋值给变量Add,并调用。
在此强调,index必须在func内部,否则作为全局变量,不形成闭包。
//调用改成如此
var Add = func();
Add();//1
Add();//2
Add();//3
var Add2 = func();
Add2();//4
Add2();//5
Add2();//6
此外,还看到如下关于闭包的示例
var add = function(x) {
var sum = 1;
var tmp = function(x) {
sum = sum + x;
return tmp;
}
tmp.toString = function() {
return sum;
}
return tmp;
}
alert(add(1)(2)(3));
初看有点绕,其实第一遍add(1)里面定义了tmp方法,且返回值是temp,故add(1)(2)其实是temp(2),返回值也是temp,sum+=x也被执行 ,以此类推。