变量作用域和闭包
变量作用域
当我们写 js 文档的时候经常会设置变量,变量的类型有两种:
- 全局变量
- 局部变量
这两种类型的变量有者不同的作用范围,全局变量的作用范围是面向整个文档的,可以称之为全局作用域,局部变量是在函数内部设置的,作用范围为当前的函数,外部不能直接引用,因此称为函数作用域。
var a=1;function test(){ var b=2; console.log(a) }test()// 1console.log(b) //error
闭包
- 简单来说嵌套在函数里的函数以及周边的变量叫闭包
- 闭包周边的变量在执行完函数之后不会被释放,会常驻内存
function test(){ var a = 1; function test1(){ var b = 2 }return test1}var test2=test()test2();
上面的代码就是一段闭包,函数test1被包裹在函数test中,对于test1而言,test内的所有变量都是可见的,但是反过来不行。将test1作为返回值,就可以在test外部进行读取了。
function test(){ var a = 1; function test1(){ a++ console.log(a) }return test1}var test2=test()test2();//2test2();//3test2();//4
在上面的代码中,函数test2实际上就是函数test1的闭包函数,我们让其执行三次,结果分别为2、3、4。这是因为,函数test中的局部变量一直被保存在内存中。所以闭包有个缺点,就是内存占用较大。
自执行函数
var callback=(function(){ var a = 1; function test(){ a ++; console.log(a) } return test;})();callback();2callback();3
上面这段函数也是闭包的一种。
我们利用闭包来做一个小例子。
- 1
- 2
- 3
我们创建了一个列表,当我们点击列表的时候,浏览器将列表里的内容弹窗显示。