• 匿名函数 闭包


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

  • 相关阅读:
    团队博客-会议之初
    5.2 个人作业2
    5.1 如何利用Intellij Idea搭建python编译运行环境
    4.27 python神器——Anaconda的安装与优化配置
    4.26 AlertDialog(对话框)详解
    4.25 xmapp启动mysql出现Error: MySQL shutdown unexpectedly.
    4.24 Android Studio下应用签名的方法以及获取 MD5、SHA1(签名)、SHA256 值
    4.23 2020.2新版本idea创建javaEE web文件
    4.22 Android studio 通过获取验证码用户登陆成功
    4.21 Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
  • 原文地址:https://www.cnblogs.com/lin3615/p/3645644.html
Copyright © 2020-2023  润新知