谈到JavaScript的闭包必然离不开作用域。在JavaScript里,作用域分为全局作用域(在任何地方都能访问)和局部作用域(在指定的代码片段内能访问)。
1、局部作用域通常是函数内部作用域,在函数外部是无法直接访问函数内部定义的局部变量。看如下代码:
function fun () {
var age = 18;
}
console.log(age) //Uncaught ReferenceError: age is not defined 报错,age未定义
由此可见,在fun函数外部是无法访问函数fun内部的age变量的
2、闭包则提供了一种在局部作用域外访问局部作用域内部变量的途径。看如下代码:
function fun () {
var age = 18;
function getAge () {
age++
return age
}
return getAge
}
var foo = fun()
console.log(foo()) //19 第一次运算的结果
console.log(foo()) //20 age并没有被回收,一直存在,所以第二次运算是:19++则是20,而不是重新定义age=18
console.log(foo()) //21 age并没有被回收,一直存在,所以第三次运算是:20++则是21,而不是重新定义age=18
我们在函数fun外部成功的获取到了函数fun内部的局部变量age。可以看出,fun函数的返回值是一个调用了局部变量age的函数getAge,那么在fun外部调用fun时能得到fun函数的内部函数getAge,而这个内部函数getAge是可以访问fun内部的局部变量age的,所以我们能够在函数fun外访问到age。由于函数fun可在对应的作用域内调用,且调用时需要访问它内部的局部变量age,所以fun内部的age需要一直存在,直到fun被回收。
3、闭包的应用场景
a、由于函数fun内部的age变量会一直存在,那么可以用来做变量值的长期保存。
b、当某些变量需要限制访问权限,做变量保护时,就可以使用闭包,提供指定的访问接口访问变量。
--------------------------------------------分割线啊分割线--------------------------------------------------
总结下前端学习感悟,如有错误,欢迎拍砖