三、函数式语言
闭包中,一个很重要的特点就是,内部函数作为一个数据被返回。这是由于 JS 是函数式语言,函数可以作为参数传递进函数,也可以作为一个数据返回。函数的嵌套构成了作用域的嵌套,也就有了作用域链。
由于函数具有作用域,且变量的寻找具有 “遮蔽效应”(从内到外,找到第一个就停止),使得局部作用域的变量对于外部作用域是不可见的,于是函数就有了封闭性,所以我们拿函数来包裹封装私有变量,同时也有了闭包。
四、自由变量
自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。
function outter() {
var a = 123;
function inner() {
console.log(a);
}
return inner;
}
var foo = outter();
foo(); // 123
对于 inner 函数而言,变量 a, 不是它的函数参数,也不是它的局部变量,a 就是自由变量。
五、闭包的用处和缺点
从闭包的特点可以看出,自由变量保存在了内存中,并能间接访问。
那么闭包的作用就是:
隐藏私有变量,解决变量命名空间污染的问题。
缺点
如果闭包过多,变量常驻内存,肯定会占用大量内存空间。
总结
由于 JS 是函数式语言,当函数记住并访问所在词法作用域的自由变量时,就产生了闭包,即使函数是在当前词法作用域外执行。 |