闭包:函数嵌套函数。
说到闭包,就不得不说作用域和作用域链。
作用域:变量的适用范围。
作用域链:如果要查找一个变量,它会一层一层的往上找,找到就返回,找不到继续向上找,如果没找到就返回undefined.
闭包:函数嵌套一个函数 或者说 函数返回一个函数 ;
在外层可以访问内层的作用域(外部的函数可以访问内部的变量) 这就是闭包.
function fn1() {
var age = 10;
debugger
return function fn2() {
return age;
}
}
console.log(fn1()()); // 10
作用域:
var msg = '你今天快乐吗?';
console.log(msg); */ // 你今天快乐吗?
作用域链:
作用域的运行机制: 采用就近原则机制;
它会找到最近的变量,如果找不到,就往上一层找,
如果还找不到,继续向上一层找,直到浏览器给我们报错. // a is not defined
当我们在局部作用域中,访问一个变量时,系统首先会在当前作用域中寻找变量var的声明语句,
如找到则直接使用.反之,则继续向上一级作用域中寻找var的声明语句,
如找到则直接使用,反之,继续向上一级作用域中去寻找…直到全局作用域,
最后找不到的话就会给我们一个报错。
作用域链代码演示:
尝试注释掉每一个变量a
var a = '小强';
function fn1() {
var a = '小明';
console.log(a);
function fn2() {
var a = '小白';
console.log(a);
}
fn2();
}
fn1();
最后总结一下哈:闭包的好处和它的一个坏处:
好处:它不仅可以访问内部的变量,变量不会污染;
坏处:当前变量会一直保存,容易造成内存泄漏;
举个例子吧,咱们vue里面中的data就是一个闭包:
data:function(){}
data作为一个函数,可以保证数据不会污染