1.在介绍闭包以前你们先看下面的代码浏览器
再看闭包
图片截的有点丑,很差意思哈函数
上面代码的输出结果是 // 11 12 13...... this
再来看另一种状况设计
你们确定注意到代码其实没有变化只是,咱们在函数里面定义变量 a 而已3d
结果却大为不一样,由于在函数外定义变量它就是全局变量了,在函数执行完cdn
毕以后,其变量不会被js的垃圾回收机制回收,只有当你手动关闭浏览器之对象
后,它的内存才会被销毁(变量回收等价于销毁内存),那么有方法让局部blog
变量内存不被销毁吗?那就得扯下闭包了图片
闭包是指有权访问另外一个函数做用域的变量的函数。建立闭包的常见方式,就是在一个函数内部建立另外一个函数。——Nicholas C.Zakas (摘自JavaScript高级程序设计)
1.举个栗子
上面就是一个典型的闭包咯,包含 outer()和一个匿名函数,匿名函数使用了外部函数做用域的变量localval,outer()()就是调用里面的匿名函数
2.关于闭包的this指向问题
因为匿名函数的执行环境具备全局性,所以this此时指向window,为何结果不是world呢函数在被调用时会自动取得变量this,内部函数经过做用域链搜索这个变量时,只能搜索到其活动对象为止,所以获取不到外部做用域的this变量,不过咱们能够用另外的方法将其获取
将this以活动对象的形式保存起来(所谓活动对象就是显示的变量,this变量是隐式的),这样咱们就能够获得obj的name值了,是否是很nice
3:闭包引发的内存泄漏
1.什么是内存泄漏
咱们都知道,计算机分配给浏览器的内存是有限的,而若是变量一直不能被回收,计算机内存会撑爆,这就是内存泄漏,而闭包就会引发这样的问题,由于建立闭包以后,其做用域链中的变量会一直存在着,没法销毁,所占用的内存会愈来愈大。
2.解决内存泄漏
闭包函数中引用外部函数做用域里的变量oBtn,咱们只有将其置为null,这样才能够确保其内存被销毁,这其实就跟最最前面写的同样,跟全局变量同样内存不会被销毁,咱们在使用闭包的同时必定要正确释放其内存,不然后果严重
结束了,但愿我写的这些可以对你们了解闭包有所用!