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;
};
}
下一篇: 基于Axis2的WS构建客户端示例