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核心概念及实践》

上一篇:Oracle 多版本控制


下一篇:block的内部实现原理