js中闭包的作用域问题

来源:互联网 发布:怎样网购淘宝怎样付款 编辑:程序博客网 时间:2024/06/05 15:48

这里写图片描述

<script type="text/javascript">    /*    *在js中当进行函数调用,会为每个函数增加一个属性SCOPE,通过这    个属性来指向一块内存    *这块内存包含所有的上下文变量,当在某个函数中调用新函数之后,新函数依然会有一个作用域    *来执行原有函数的SCOPE和自己新增的SCOPE,这样就形成了一个链式结构,这就是js中的作用于链    *注意内存模型,看博客详解    */        var color = "red";        function showColor(){            alert(this.color);        }        function changeColor(){            var anotherColor = "blue";            function swapColor(){                var tempColor = anotherColor;                anotherColor = color;                color = tempColor;            }            swapColor();        }        changeColor();        showColor();    </script>

这里写图片描述
当程序执行完changeColor时,会依次释放掉swapColor和changeColor的作用域。然后执行showColor,当再次调用this.color时已经被修改为blue了

闭包作用域链延长的关键

这里写图片描述

<script type="text/javascript">    /*    *通过以下操作带来的最大的好处是,compareObject的作用域变大了,    *当compareObject结束之后,prop这个变量依然存在    */        function compareObject(prop){        //匿名函数不是闭包            return function(obj1, obj2){                if(obj1[prop] > obj2[prop]) return 1;                else if(obj1[prop] < obj2[prop]) return -1;                else return 0;            }        }        var o1 = {name:"Leno", age:22};        var o2 = {name:"Ada", age:28};        //此时就是基于age来比较的        /*        *在java或c++中,以下代码执行完毕之后,需要进行内存释放        *此时对于java或c++这些静态语言而言,prop会被释放        *但是在js中作用域却变大了        */        var compare = compareObject("age");        //此时就比较了o1和o2        /*        *在js中,prop在这里依然可以被访问,这种通过返回函数的方法扩大作用域的方法就是闭包        */        var res = compare(o1, o2);        alert(res);    </script>
0 0
原创粉丝点击