// 匿名函数就是没有名字的函数,也称拉姆达函数(lambda),功能强大
// 经典函数声明
function functionName(arg0, arg1, arg2)
{
// 函数体
}
// 以函数表达式的形式定义函数(即匿名函数)
var functionName = function(arg0, arg1, arg2){
// 函数体
};
// 如下 test() 就返回一个匿名函数
function test(pn)
{
return function(obj1, obj2)
{
var v1 = obj1[pn];
var v2 = obj2[pn];
if(v1 < v2)
{
return -1;
} else if (v1 > v2)
{
return 1;
}else
{
return 0;
}
}
}
// 闭包:是指有权访问另外一个函数做用域中的变量的函数。建立闭包的常见方式,就是在一个函数内部建立另外一个函数
function test(pn)
{
// 如下是匿名函数
return function(obj1, obj2)
{
var v1 = obj1[pn]; // 访问了外部函数中的变量 pn
var v2 = obj2[pn]; // 访问了外部函数中的变量 pn
if(v1 < v2)
{
return -1;
} else if (v1 > v2)
{
return 1;
}else
{
return 0;
}
}
}
// 即便这个内部函数被返回了,并且是在其它地方被调用了,但它仍然能够访问变量 pn。之因此还能访问这个变量,是由于内部函数的做用域链中包含 test() 的做用域。是这由于:当某个函数第一次被调用时,会建立一个执行环境及相应的做用域链,并把做用域链赋值给一个特殊的内部属性([scope]).而后使用 this,arguments 和其它命名参数的值来初始化函数的活动对象(activation object)。但做用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位……。直到做为做用域链终点的全局执行环境。在函数执行过程当中,为读取和写入变量的值,就须要在做用域链中查找变量
function compare(value1, value2)
{
if(value1 < value2)
{
return -1;
}else if(value1 > value2)
{
return 1;
}else
{
return 0;
}
}
var result = compare(5, 10);
// 以上代码先定义了 compare() 函数,而后又在全局做用域中调用了它。当第一次调用 compare() 时,会建立一个包含 this,arguments,value1, value2 的活动对象。全局执行环境的变量对象(包含 this, result, compare)在compare()执行环境的做用域链中则处于第二位。闭包