什么是闭包,为什么要用他?
闭包是能够访问其他函数作用域的函数。
我们来分析下句子成分(语文大神),闭包是函数,js函数的作用域分为全局作用域,局部作用域,eval作用域,并没有块级作用域形象的讲,每个函数都是一个小黑屋,能在小黑屋里看到外面的的世界,可是外界不知道小黑屋里是啥情况,如何打开门从小黑屋出来呢,就用到了闭包。
有几个概念必须要了解
作用域和作用域链
原来作用域和上下文作用域是两个不同的概念,本质上来说,作用域是基于函数的,上下文是基于对象的,作用域规定了当前执行环境对变量的访问权限,这是js中最重要一个概念。
作用域链(词法作用域):当查找变量的时候,会先从变量本身查起,如果本身没有就从父级对象上查找,一直查到全局上下文变量对象,若无返回undefine,这个由多个执行上下文对象构成的链表就叫做作用域链。
闭包的特点:
1、函数内再嵌套函数
2、内部函数可以引用外层的参数和变量。
3、参数和变量不会被垃圾回收机制回收
闭包的使用注意事项
函数会使得函数中的变量保存在内存中,会占用内存,所以只有在必要的时候使用它,如果不用的话要将他为null
MMP Show Me The Code
function example(){
var n=1;
function example2(){
alert(n);
};
return example2;
}
var result=example(); result(); // 1
在自己函数内部定义一个函数,然后再将函数值return回去
function example1(){
var n=1;
Add = function() { n+=1 }
function example2(){
alert(n);
}
return example2;
}
var result=example1(); result(); // 1 Add(); result(); // 2
解析:result();
函数定义了一个变量 ,调用时直接返回一个函数,example2里面没有n,沿着作用域链向上找到了n=1;
Add();执行后n的值为2;
然后example2向上查找时n就变成了2;
小结:整理了一下午,到处查资料,原来探究越深才知道知道的越少,这些东西很重要,检验你是否学好可以试着给别人讲懂。
由于自身能力有限,有些错误在所难免,欢迎指正,荣幸之至。