匿名函数 闭包

// 匿名函数就是没有名字的函数,也称拉姆达函数(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()执行环境的作用域链中则处于第二位。

原文地址:https://www.cnblogs.com/lin3615/p/3645644.html