闭包的理解,以及一些小例子
众所周知,闭包就是可以在一个函数中调用另一个函数的变量;我们怎么用闭包解决一些开发中用到的小问题;
我们先看一个小例子
这个例子的结果不管num[]中的数字是多少,它的结果都是4,在ES5中,没有块级作用域,只有函数作用域,所以for循环中生命的i是在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,所以结果都是4。我们在ES5中最常用的是闭包来解决全局i被覆盖的问题。
正如下面这样
这样打印出来的结果就是我们想要的结果,现在有一种更简便的方法,ES6提供了我们一种新的方法:let,let是在块级作用域内有效,这样每次循环就不会把这个结果覆盖掉,把上面的代码更改为下面的样子就可以了。
理解了闭包我们来做一个小实例
for( var i = 4; i -- ; ){
setTimeout(function(){
console.log(i);
},i*150)
}
是不是感觉蒙了,只知道每个语法的应用,一合起来就不知道结果了,起始这道题的结果是4个-1。
接下来我们就来分析一下这道题:首先我们知道for循环的语句有三个,但是这个只有两个我们怎么判断它终止呢,其实在for循环中,当定义的变量小于零时,我们就终止循环。for的循环是3,2,1,0,当等于0时继续执行继续执行的i的值就变成了-1;
知道了这个结果,我们怎么改变这个函数得到我们希望得到的值呢,这就用到我们上面说的方法,利用闭包,或者ES6的方法,
得到的结果你是不是感觉是3,2,1,0呢,如果你以为是这样就错了,因为我们还有一个定时函数,i*150,这样我们的结果是:0,1,2,3。看了这个小练习你理解了吗?