1.什么是闭包
闭包是指有权访问另一个函数作用域中的变量的函数
2.作用
延伸变量的作用的范围
3.特点
优点:能够延伸变量的作用域的范围,这些变量一直存放在内存中,不会在调用结束后被垃圾回收机制回收。
缺点:由于闭包会使用函数中的变量会一直存在内存中,内存消耗很大,所以不能滥用;解决的办法就是退出函数之前,将不使用的变量删除。
局部变量会常驻在内存中;
可以避免使用全局变量,防止全局变量污染;
会造成内存泄漏(有一块内存空间被长期占用,而不被释放)
闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰。闭包会发生内存泄漏,每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根指针给内部活动对象。
闭包内存泄漏为: key = value,key 被删除了 value 常驻内存中; 局部变量闭包升级版(中间引用的变量) => 自由变量;
4.示例
-
闭包函数
function fn1() { //fn1就是闭包函数 var num = 10; function fn2() { console.log(num); } fn2(); } fn1();
10
-
循环注册点击事件
for (var i = 0; i < lis.length; i++) { (function(i) {//产生闭包 lis[i].onclick = function() { console.log(i); } })(i); }
-
计算打车价格
打车起步价13(3公里内),之后每多一公里增加5块钱,用户输入公里数,如果有拥堵情况,总价多收取10块钱var car = (function() { var start = 13; var total = 0; return { price: function(n) {//计算价格 if (n <= 3) { total = start; } else { total = start + (n - 3) * 5 } return total; }, yd: function(flag) { //是否拥堵 return flag ? total + 10 : total; } } })(); console.log(car.price(5)); console.log(car.yd(true)); console.log(car.price(1)); console.log(car.price(false));
23
33
13
13
-
思考是否产生闭包
var name = "the window" var ob1 = { name: "my object1", fn: function() { //没有产生闭包, return function() { return this.name; //立即函数的this指向window } } } console.log(ob1.fn()()); //fn()() 立即函数 var ob2 = { name: "my object2", fn: function() {//产生闭包 var that = this; return function() { return that.name; } } } console.log(ob2.fn()());
the window
my object2