在说闭包之前,我们先来了解一下变量的作用域。局部变量,是在函数内部声明,局部变量不可以在函数外部使用。本质原因:函数在被调用的时候会入栈,并且分配空间,函数内部的变量都是在这块空间内部声明的。当函数运行完毕之后就会出栈,系统回收空间,函数内部的变量所占的空间也会被收回,所以不能在函数外部使用函数内部定义的变量。
闭包:通俗来说,函数里面套函数就可以形成闭包。闭包里面使用局部变量和函数参数的时候,用的就是外部函数的局部变量
闭包的应用场景:①利用闭包可以保存局部变量,实例如下:
说明:函数t(),里面的点击方法会形成闭包,随着for循环运行是10次,函数t也会运行10次,每次t运行的时候都会有一个变量a,然后每一个闭包保存了函数t运行时候的变量a
for(var i = 0; i < divs.length; i++){
function t(){
var a = i;//局部变量
divs[i].onclick = function(){
setTimeout(function(){
console.log(a);
}, 1000);}}
t();}
-------------------------------------------------------------------------
var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
divs[i].index = i;
divs[i].onclick = function(){
var _this = this;//因为计时器的this始终指向window,所以我们要用一个变量来保存当前的this
setTimeout(function(){console.log(_this.index);},1000);}}
②利用闭包可以保存当前参数,实例如下:
for(var i = 0; i < divs.length; i++){
(function(i){
divs[i].onclick = function(){
setTimeout(function(){console.log(i);}, 100);}})(i);}
闭包的弊端:容易造成内存泄露。