为什么会有闭包这个概念呢?这就要理解js特殊的变量作用域,变量的作用域有两种:全局变量和局部变量。而js语言的特殊之处,就在于函数内部是可以直接读取全局变量的。

来看下下面的这段代码:

//会输出啥? for(var i = 1; i<10; i++){ setTimeout(function(){ console.log(i); }, 0) }

相信大家看到这个代码脑海想到的就是输出1-9,但是结果确是都是10。这里用了setTimeout这个函数,可能一看到他的执行时间为0想到的肯定都是马上执行,这是一个错误的想法,具体的可以看下我的另外一篇文章理解js的运行机制
想要上面的输出达到预期的效果可以修改成如果下:

//1.用let关键字; for(let i = 1; i<10; i++){ setTimeout(function(){ console.log(i); }, 0) } //用一个立即执行函数来搞 for(let i = 1; i<10; i++){ (function(j){ setTimeout(function(){ console.log(j); }, 0) })(i)//马上把当前的值存起来 }

上面的两种方式都是为了改变变量的作用域,这样子就能正确的输出值了。上面那个立即执行函数就是一个匿名闭包。

再说一个闭包另外一个作用:
可以用来外部访问内部的私有变量,如果大家有了解过其他的编程语言,比如java,php这些语言声明私有方法的。它们只能被同一个类中的其它方法所调用。外部的类想要调用它的私有方法,就可以通过一个公共方法去调用它的私有方法。那我们怎么用js的闭包去模拟这种呢,请看下面的代码。

function person(){ var firsName = "袁"; var lastName = "杰"; return { firstName(){ return name; }, lastName(){ return name; }, } } var fun = person(); fun.firstName(); //袁 fun.lastName(); //杰

今天就写到这里吧,这篇文章仅当做一个学习心得来写的,如果你看了这篇文章感觉有收获的话,记得点个赞喔,嘿嘿。