首页 > 代码库 > JavaScript的闭包详解
JavaScript的闭包详解
(1)定义:
函数内部返回一个函数,返回出来的这个函数叫做被我们称之为闭包(个人理解的最简单的表现形式,)
(2)为什么要使用闭包呢?
局部变量在函数执行完之后就会被GC回收,有时候我们想在外部访问内部的变量,这个时候就用到了闭包
(3)闭包有两个作用:
a.访问函数内部的变量(函数作为返回值)
b.保存作用域(函数作为参数传递)
1 //1.访问函数内部的变量(函数作为返回值) 2 function test(){ 3 var age = 18; 4 return function(){ 5 console.log(age); 6 } 7 } 8 9 var myTest = test();10 console.log(myTest);//为匿名函数,function(){console.log(age)}11 myTest();//1812 13 14 15 //另一个例子16 function fn() {17 var max = 10;18 return function bar(x) {19 if (x > max) {20 console.log(x);21 }22 }23 }24 var f1 = fn();25 console.log(f1);//function bar(x){if(x>max){console.log(x);}}26 f1(15);//结果为1527 28 29 //保存作用域(函数作为参数传递)30 31 //保存作用域32 function test(){33 var a = 1;//局部变量34 hehe = function(){//全局变量35 a++;36 };37 return function(){38 console.log(a);39 }40 }41 42 var haha = test();//此时haha为test()执行完之后的返回值,匿名函数function(){consolloe.log(a)}43 haha();//打印144 hehe();//hehe函数为全局变量,可以在外边执行,此处a++45 haha();//打印246 hehe();//同上47 48 //注意:haha为全局变量,不会被GC回收,所以test函数的返回值,一直存在,test的作用域一直存在,不会被GC回收49 50 //注意:自由变量跨域取值时,要去创建这个函数的作用域取值,而不是“父作用域”;51 //52 var max = 10;53 var fn = function(x){54 if(x>max){55 console.log(max);//1056 console.log(x);//1557 }58 };59 60 (function(f){61 var max = 100;62 f(15);63 })(fn);
(4)闭包的使用
假设页面上有5个div节点,我们通过循环来给每个div绑定onclick事件,按照索引顺序,点击第一个div时弹出0,点击第2个div时弹出1,以此类推。
1 <body>2 <div>1</div>3 <div>2</div>4 <div>3</div>5 <div>4</div>6 <div>5</div>7 </body>
1 //闭包的使用 2 3 var nodes = document.getElementsByTagName(‘div‘); 4 for(var i=0;i<nodes.length;i++){ 5 nodes[i].onclick = function(){ 6 console.log(i); 7 } 8 } 9 //思考一下,存在什么问题??10 // 点击每一个打印的都是5是不是···11 12 13 var nodes = document.getElementsByTagName(‘div‘);14 for(var i=0;i<nodes.length;i++){15 (function(i){ //块级作用域或私有作用域16 nodes[i].onclick = function(){17 console.log(i);18 }19 })(i)20 }21 //上述方法优点:把每次循环的i值都封闭起来
(5)使用闭包的注意点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,
所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
JavaScript的闭包详解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。