javascript闭包的理解

首先强烈要求看一下如何用js实现一个自增计数器,才能明白私有变量存在的意义,闭包存在的意义。

再参考自执行函数深入理解JS闭包

通过阅读上面大佬的文章,说一下个人的理解,首先明白:

1.所谓闭包要解决的问题是js中没有 所谓私有变量,不像java中有private,public等各种访问权限修饰符,然后还可以通过公有的getter和setter()方法提供访问的方式。

2.但是js中有变量分全局变量和局部变量

3.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量,javascript语言特有的‘链式作用域’结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。也就是说函数内部可以读取到其直接上级作用域内的变量。但是函数外部无法读取到函数内部用var定义的变量。

4.js函数根据其定义的形式,将决定其何时被加载进内存,何时被释放(即是否会在内存中被保留):

函数声明:function box(){var x=1;}的形式,只有执行box()的时候其内部定义的局部变量x才会被加载进内存,执行完后局部变量x将被释放,(即使定义同名全局变量,相当于两个变量二者也不相关);

函数表达式:var box1 = function(){var y=1;};或者先定义函数function box(){var y=1;};后将该函数赋值给全局变量var box1=box();这种将函数赋值给全局变量的,由于box1没被释放所以该函数及其内部定义的变量y也不会被释放,这样可以使得局部变量得以保存在内存中;

匿名函数:function(){} 属于函数表达式,匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){}。

函数表达式后面加括号可以立即执行函数,函数声明不可以,只能以fnName()的方式调用才行(题外话)

//函数表达式,后面的()运算符,里面加入函数对应的参数就可以立即执行
(function(a){
  alert(a); 
})("123")

//函数声明,只能是FnName(param)的形式调用
box();
function box(){
  alert("aaa"); 
}

5.var关键字定义的变量在哪里定义其作用域就在哪里,不使用var关键字定义的变量(无论是在什么地方定义的)就会成为全局变量(全局变量不会被释放,会一直存在于浏览器内存中,)。

理解了上面这些再看下面的代码

<p id="demo"></p>
<script>
// 初始化计数器
// 递增计数器的函数
function add() {
  var counter = 0;
  function f1(){
    counter++;
    return counter;
  }
  setN=function set(n){
    counter=n;
    return counter;
  }
  getC=function getCounter(){
    return counter;
  }
  return f1;
}
var result=add();
result();
result();
result();
// 计数器目前应该是 3
document.getElementById("demo").innerHTML = "计数器是:" + getC()+"现在set一下是:"+setN(10);
</script>

再add()函数内定义了一个局部变量counter,注意我们将add()函数赋值给了全局变量result,使其得以保存在内存中,则counter也可以保存再内存中,而counter又是add()内的局部变量,外部无法访问到,只有add内部可以访问到。现在我们在add()内部定义了一个函数f1,而函数f1给counter进行了自增并将counter作为返回值返回。这样有什么用呢?如果我们想要在add()外部执行函数f1(即对counter进行自增),那么我们应该怎么办呢?我们可以将在函数add()内,直接将函数f1作为返回值,这样我们使用全局变量result就可以得到函数add()内的函数f1()的引用,我们可以使用result()来实现add()内的f1(),即在函数外部实现了对局部变量的操作,就相当于是在实现了私有变量。

result实际上就是闭包f2函数。

除此之外,我们还可以在add()内定义全局变量setN=function set(n)和 getC=function getCounter()来实现getter和setter方法,其实仔细想是一样的,我们可以在add内定义一个zizen=function add1(){counter++;return counter;},然后在全局调用zizen(),setN(n),getC()等。

我个人觉得所谓闭包,作用就是在函数外部拿到函数内部定义的局部变量的操作权限,从而实现私有变量的概念。

以上纯属个人理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值