function addNum(a,b){
function add(n1,n2){ return n1+n2; }
return add(a,b);
} 闭包,指某种程序语言中的代码块允许一级函数存在并且在一级函数中所定义的自由变量能不被释放,直到一级函数被释放前,一级函数外也能应用这些未释放的自由变量。 闭包,其实就是指程序语言中能让代码调用已运行的函数中所定义的局部变量。闭包,就是封闭了外部函数作用域中变量的内部函数。但是,如果外部函数不返回这个内部函数,闭包的特性无法显现。如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包。此时,闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放。 闭包的方式: a.自运行模式
(function(params_declare){//params_declare 参数声明
//使用params_declare do something
})(parms_value);//parms_value要求是参数值 匿名函数就是没有实际名字的函数,也是被调用的哦(如上红色的括号,表明调用和参数)!(function(x,y){ return x+y;})(2,3); b.方法对象模式
function Fun(parms){
var innerParams;//内部参数
function innerFun(){//内部函数要求没有参数
//利用fun的参数和innerParmas参数 do something
//注意:innerFun对innerParams的变动,会影响每一个Fun的实例化的对象
}
return innerFun;//必须没有括号
}
自运行模式示例
当用户先后按住键盘的ctrl+enter时,弹出消息
(function(mess){
var clickCount=0;//记录时间触发次数的变量
var preCode="";//记录前一个键盘的Code的便来那个,用于判断是不是ctrl键
document.body.onkeydown = function(){
if(preCode=="17" && event.keyCode=="13"){
clickCount++;//自增
alert(mess+",次数:"+clickCount);//第一次提示消息:"触发事件,次数:1",第二次提示消息:"触发事件,次数:2"
}else{
preCode=event.keyCode;//记录前一个键盘的Code
}
}})("触发事件");
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
function a(){
var i=0;
function b(){ alert(++i);}
return b; //函数a将其内部函数b返回
}
var c = a();//变量c指向了函数b
c(); //执行c()后就会弹出一个窗口显示i的值(第一次为1)
c();c();c(); //我们多执行几次看看
闭包有什么作用?
在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC(如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收)不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。