闭包的定义:
闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」。
我们知道,js中函数可以当作参数传递,自然也是可以被return返回的,如果一个函数内部定义的函数,使用了外部函数定义的局部变量,那么当
外部函数返回时,其定义的局部变量空间不会释放,这跟C++是不一样的。
function outer () { var a=8; function inner () { var b=9; } }
在这里inner函数可以访问outer函数定义的a变量,但是反过来不可以。还要注意的一点是,如果是想定义函数内部的局部变量,必须用var声明,否则声明的是个全局变量。**********************************************************************************************************************************
例1
当闭包函数需要传参数时,需要调用外部函数,返回给一个变量,这个变量就变成一个函数,然后执行这个函数。function newClosure(someNum,someRef){ var num=someNum; var anyArray=[1,2,3]; var ref=someRef; //console.log(‘hello world’); return function(x){ num+=x; anyArray.push(num); console.log('num:'+num+'\nanArray:'+anyArray.toString()+'\nref.someVar:'+ref.someVar); } } var closure1=newClosure(40,{someVar:'closure 1'});//如果不注释掉console.log(‘hello world’)将会输出hello world. var closure2=newClosure(1000,{someVar:'closuere 2'}); closure1(5); closure2(-10);
***********************************************************************************************************************************
例2
function sayAlice() { var sayAlert = function() { console.log(alice); } var alice = 'Hello Alice'; return sayAlert;}var helloAlice=sayAlice();helloAlice();
这个例子说明,闭包函数定义在外围函数的局部变量前,也能使用局部变量。
***************************************************************************************************************
例子3(我想让一个数组里的每个元素是个函数,然后执行的,但是不知道为啥)function buildList(list) {//传入个类似数组之类的线性表 var result=[]; for (var i = 0; i < list.length; i++) { result.push(function(){ //将一个函数放入到一个数组中 console.log(list[i]); } ); }; return result;//返回这个数组,每一个元素都是一个函数,好神奇的JS } function testList() { var fnlist = buildList([1,2,3]); // using j only to help prevent confusion - could use i for (var j = 0; j < fnlist.length; j++) { fnlist[j]();//无法运行,哪个大侠说说原因? } }