javascript闭包小结

深入理解JavaScript闭包
本文详细解析了JavaScript中闭包的概念及其特点,并通过具体实例展示了闭包的基本应用和在循环中的特殊情况。闭包能够让内部函数记住并访问其外部函数的作用域,即使外部函数已经执行完毕。

对比看了几本书关于闭包的介绍,感觉《JavaScript面向对象编程指南》一书中介绍的最为清楚,其他部分书籍很多只讲结果,不讲具体原因,不易理解。总结如下

1、闭包的定义

    • 如果一个函数会在其父级函数返回之后,留住对父级作用域的链接的话,闭包就会被创建起来。

2、闭包的特点

    • 在函数A内部定义内部函数B。
    • 内部函数B操作函数A的私有变量。
    • 内部函数返回给外部变量使用,或被函数A立调用。

3、闭包实例

(1)基本的闭包

//通过返回内部函数实现对闭包内部函数的访问
function F1(param){
 
  var N = function () {
      return param;
  };
  param++;
  return N;
}

var inner=F1(1);
inner();
//inner()返回结果2,
//如果将return param;更改为return param++;,每次调用返回值增加1

此种方式类似于java语的类中的public函数功能,封装了对内部变量的访问

  • (2)循环中的闭包 循环中的闭包比较容易引起误解,如下面的代码:

//循环中的闭包
function F2(){
    var arrInner=[],i;
    for (i=0;i<2;i++){
        arrInner[i] = function () {
            return i;
        };
    }
    return arrInner;
    //注意arrInner是个函数数组
}

var closure_loop = F2();
closure_loop[0]();
//2
closure_loop[1]();
//2

         在循环过程中,每次迭代都会创建一个返回当前循环号的新函数,即创建一个新的闭包,指向一个共同的局部变量i。但是闭包并不会记录他们的值,他们所拥有的只是相关域在创建时的一个引用。当返回函数要去获取某个变量时,会从其所在的域开始逐级寻找最近的i值,而循环结束时i值为2,所以返回函数都指向了这个值。

参考:

1、《JavaScript面向对象编程》第2版

2、《JavaScript核心概念及实践》

转载于:https://www.cnblogs.com/sylarmeng/p/5416902.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值