欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript之匿名函数与闭包

程序员文章站 2022-04-05 10:29:46
...

一、匿名函数

  匿名函数就是没有名字的函数, 函数的定义大致分为三种方式:

  第一种:普通函数

function f1(){
	return 'Danie_wu';
}
  第二种:Function构造函数

var f1 = new Function('a', 'return 2 * a;');
  这种方法把参数列表和函数体都作为字符串,很不方便,不建议使用 。

  第三种:函数赋值表达式

var f1= function (a){
    return 2 * a;
}
alert(f1(2));

  “=”的右边就是一个匿名函数。

  匿名函数的执行方法有两种:第一种就是上面的函数赋值表达式;第二种是通过自我执行,具体如下:

(function(a, b){
    alert(a + b);
})(4, 5);
第一个()把它封装成表达式,第二个()表示执行函数,并且传参。


二、闭包(closure)

   闭包是可访问一个函数 作用域里变量的函数;它是JavaScript中非常重要的知识,因为使用闭包可以大大减少我们的代码量,创建闭包的常见方式就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量,使用闭包有一个优点:就是可以把局部变量驻留在内存中,可以避免使用全局变量;也有缺点:由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存,过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。


function f1(){
     var user = 'Danie_wu';
     return function(){
             return user;
     };
}
alert(f1()());//这里是直接调用

var b = f1();
alert(b());//这里调用匿名函数的返回值


    说了这么多,闭包的作用还是有点模糊,下面举一个通过闭包实现局部变量的累加的例子:

//通过局部变量来累加
function sum(){
         var x = 100;
         x++;
         return x;
}
alert(sum());//101
alert(sum());//101,无法实现累加,因为执行时又                     //被初始化了
//通过闭包可以实现局部变量的累加
function sum(){
       var x = 100;
       return function(){
               x++;
               return x;
       }
}

var y = sum();
alert(y());  /,101,调用匿名函数
alert(y());  //102,第二次调用匿名函数,实现累加

   闭包里this对象

   在闭包里使用this对象也可能会导致一些问题,this对象实在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果在函数内部就是指向这个对象。而闭包却在运行时指向window,因为闭包并不属于这个对象的属性和方法。

   

var user = 'window';
var obj = {
       user:'object',
       getUserFunction:function(){
             return function(){
                     return this.user;
             }; 
       }
};

alert(obj.getUserFunction()());//window

//不过可以用对象冒充来强制指向某个对象
alert(obj.getUserFunction().call(obj));//object

//也可以从上一个作用域中得到对象
getUserFunction:function(){
      var that = this;
      return function(){
             return that.user;
      };

}