JavaScript笔记4--闭包

来源:互联网 发布:mac能玩穿越火线吗 编辑:程序博客网 时间:2024/05/20 18:53

1.啥是闭包?

闭包是一个函数,一个能够读取某函数内部变量的一个函数。

2.闭包有啥用途?

通过闭包可以读取某函数的内部变量,相当于扩大了变量的访问范围;

3.闭包举例

示例1

function add(num1,num2){    var innerAdd = function(){        alert(num1+num2);    }    return innerAdd; }//客户端:$(function(){    var innerAdd = add(1,2);    setTimeout(innerAdd,5000);    var innerAdd = add(2,2);    setTimeout(innerAdd,5000);});</script>

innerAdd 是一个闭包,它延长了变量num1、num2的生命时间;
注意,此时的num1、num2是形参哈;

示例2

<script type="text/javascript">$(function(){/*************** 给每个span元素追加点击事件 ****************/    //test1    var spans = $("#divTest span");    for (var i = 0; i < spans.length; i++) {        var clickFunction = function() {            alert(i);        };        spans[i].onclick = clickFunction;    }    //test2    var spans = $("#divTest span");    for (var i = 0; i < spans.length; i++) {        function out(num){            var clickFunction = function() {                alert(num);            };            return clickFunction;        }        spans[i].onclick = out(i);    }});</script>--------------------------------------<body>    <div id="divTest" >        <span>0</span> <BR/>        <span>1</span> <BR/>        <span>2</span> <BR/>        <span>3</span> <BR/>    </div></body>

test1结果:
每次都是4。原因分析:
clickFunction 是一个闭包,它延长的是变量 i 的生命时间。注意,此时的 i 可不是形参哈。
当i的值为4的时候,判断条件不成立,for循环执行完毕。但是因为每个span的onclick方法这时候为内部函数,所以i被闭包引用,内存不能被销毁,i的值会一直保持4。直到程序改变i的值或者所有的onclick函数销毁(主动把函数赋为null或者页面卸载)时才会被回收。这样每次我们点击span的时候,onclick函数会查找i的值(作用域链是引用方式),一查等于4,然后就alert给我们了。
也就是说,当for循环执行完毕,此时的 i = 4;由于闭包延长了 i 的生命时间,所以在内存中,i =4 一直存在着。当点击事件触发时,会弹出4.
test2结果:
分别是1,2,3,4。原因分析:
clickFunction 是一个闭包,它延长的是变量 num 的生命时间,并不是变量 i 。
每次调用out函数,都会新创建一个新的out函数的作用域空间。所以闭包延长的是当前变量 num 的生命时间。注意,此时的 num 是形参,这个形参的值来自于 i 。
从本质上讲,如果内部函数引用了位于外部函数中的变量,相当于授权该变量能够被延迟使用。因此,当外部函数调用完成后,这些变量的内存不会被释放(最后的值会保存),闭包仍然需要使用它们。

0 0
原创粉丝点击