JavaScript之匿名函数与闭包

一、匿名函数

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

  第一种:普通函数

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;
      };

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值