1、匿名函数与闭包的区别
匿名函数:没有函数名称的函数;
第一种方式
function(argument1,argument2,argument3){
}
第二种方式
(function(x, y){
alert(x + y);
})(2, 3);
这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。(在闭包中经常看到,但只是匿名函数,并不代表闭包)
2 、闭包:一个可以使用另外一个函数作用域中的变量的函数。
如下面的代码函数b就是闭包,但是这个前提是:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:
function a(){
var i=1;
function b(){
++i;
return i;
}
return b;
}
var c=a();
alert(c()); //2
alert(c()); //3
alert(c()); //4
函数调用返回后一个没有释放资源的栈区;
一般,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域,但闭包的情况是不一样的。闭包的活动对象依然会保存在内存中,于是像上例中,函数调用返回后,变量i是属于活动对象里面的,就是说其栈区还没有释放,但你调用c()的时候i变量保存的作用域链从b()->a()->全局去寻找作用域var i声明所在,然后找到了var i=1;然后在闭包内++i;结果,最后输出的值就是2了;不知道这么说有没人明白,如果不明白,那么只要记住它的闭包的两个点就好了,一点就是闭包的活动对象没有被销毁;第二点是作用域链的关键是他要遇到var 声明;就好了····
闭包会携带它的函数的作用域,因此会比其他函数占用更多的内存,所以使用闭包要非常注意
3、匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。
一:
var oEvent = {};
(function(){
var addEvent = function(){ /*代码的实现省略了*/ };
function removeEvent(){}
oEvent.addEvent = addEvent;
oEvent.removeEvent = removeEvent;
})();
在这段代码中函数addEvent和removeEvent都是局部变量,但我们可以通过全局变量oEvent使用它,这就大大减少了全局变量的使用,增强了网页的安全性。 我们要想使用此段代码:oEvent.addEvent(document.getElementById(‘box’) , ‘click’ ,
二:
function(){});
var rainman = (function(x , y){
return x + y;
})(2 , 3);
/**
* 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。
* var rainman = function(x , y){
* return x + y;
* }(2 , 3);
在这里我们创建了一个变量rainman,并通过直接调用匿名函数初始化为5,这种小技巧有时十分实用。
三:
var outer = null;
(function(){
var one = 1;
function inner (){
one += 1;
alert(one);
}
outer = inner;
})();
outer(); //2
outer(); //3
outer(); //4
这段代码中的变量one是一个局部变量(因为它被定义在一个函数之内),因此外部是不可以访问的。但是这里我们创建了inner函数,inner函数是可以访问变量one的;又将全局变量outer引用了inner,所以三次调用outer会弹出递增的结果。