闭包(closure)就是能够读取其他函数内部变量的函数。闭包是在某个作用域内定义的函数,它可以访问这个作用域内的所有变量。闭包主要有两个作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。
特点
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收
闭包作用域链
1.函数本身作用域。
2.闭包定义时的作用域。
3.全局作用域。
创建函数的方法
在JavaScript中创建函数的方法有两种:函数声明和函数表达式,写法如下:
1 | // 方法一:函数声明 |
还有一种自执行函数表达式,主要用于创建一个新的作用域,在此作用域内声明的变量不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行:
1 | (function() { |
此种自执行函数表达式归类于以上两种方法的第二种,也算是函数表达式。
闭包案例
1 | function testVarible() { |
上记代码说明变量num没有随着函数调用完后而消失。
1 | var arr = []; |
上记代码闭包代码createClosure()方法会在每次循环中调用,每次循环的时候就会产生新的作用域,就会产生10个不同的作用域,最后的结果就是n=0,n=1,n=2,…,n=9
1 | var arr = []; |
上记代码闭包代码createClosure()方法只调用一次,只有一个作用域,所以变量会是最后一次调用完后的值,最后的结果就是n=10,n=10,n=10,…,n=10