函数之闭包

一、函数声明与函数表达式

     使用函数声明时,都会给函数定义一个name属性,该属性用于得到函数指定的名字。且它的另一个重要特征是函数声明提升,简言之就是函数声明可以放在调用其函数语句的后面,而函数表达式不行,否则会出错。

【示例】

<script type="text/javascript">
        function Person() {

        }
        alert(Person.name);//Person
    </script>

二、递归函数

【描述】
       递归函数是在一个函数通过名字调用自身的情况下构成的。
【示例】
<script type="text/javascript">
        function f(num) {
            if (num <= 1) {
                return 1;
            }
            else {
                return num * arguments.callee(num - 1);
            }
        }
        alert(f(5));//120
    </script>

三、闭包

【描述】
         闭包是指有权访问另一个函数作用域中的变量的函数。
【常见方式】
         在一个函数内部创建另一个函数
【示例】
<script type="text/javascript">
        function Person(age) {
            return function(object1,object2) {
                var a = object1.age;
                var b = object2.age;
                if (a > b) {
                    return object1;
                }
                else {
                    return object2;
                }
            };
        }
        //此时返回的是一个函数
        var compare = Person(23);
        //调用返回的函数
        var result = compare(24, 34);
        alert(result);//34
        //解除对匿名函数的引用,以便释放内存
        compare = null;
        var result2 = compare(34, 25);
        alert(result2);//出错
    </script>

分析:
     作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

3.1 闭包与变量

      作用域链的这种配置机制有一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。记住,闭包所保存的是整个变量对象,而不是某个特殊的变量。
【示例】
<script type="text/javascript">
        function example() {
            var array = new Array();
            for (var i = 0; i< 10; i++) {
                array[i] = function () {
                    return i;
                };
            }
            return array;
        }
        var exam = example();
        for (var i = 0; i < exam.length; i++) {
            alert(exam[i]());//全部是10
        }
    </script>

很明显,这不是我们想要的,因为我们已经确认过眼神了。接下来需要进行改造,遇到那个对的人。
【示例】
<script type="text/javascript">
        function example() {
            var array = new Array();
            for (var i = 0; i < 10; i++) {
                array[i] = function (num) {
                    return function () {
                        return num;
                    };
                }(i);
            } 
            return array;
        }
        var exam = example();
        for (var i = 0; i < exam.length; i++) {
            alert(exam[i]());//0,1,2,3,4,5,6,7,8,9
        }
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值