JavaScript 4.3 函数高级-闭包

来源:互联网 发布:淘宝产品推广方案 编辑:程序博客网 时间:2024/06/05 03:00

JavaScript 4.3 函数高级-闭包

 

1.闭包的概念

    在函数内的变量都可以保存(隐藏)在函数的作用域中,看起来好像函数将变量“包裹”了起来,这种特性在计算机科学文献中成为“闭包”。

    从技术角度来讲,所有JavaScript函数都是闭包。但我们要说的闭包是闭包中的一种特殊情况,这种情况—调用函数时闭包所指向的作用域链和定义函数时的作用域链不同,常常发生在一个函数嵌套了另一个函数,外部函数将嵌套的函数对象作为返回值。很多强大的编程技术都利用了这类嵌套函数的闭包,我们要讨论的就是这种情况。

 

2.闭包的功能

    闭包的的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

 

3.闭包的实现原理

读取函数内部的变量可以在函数内部嵌套函数。

我们知道,因为作用域的关系,于函数内部可以直接读取全局变量,另一方面,在函数外部自然无法读取函数内的局部变量。嵌套函数的作用域链包含外部函数的变量。

 

让这些变量的值始终保持在内存中,可以将嵌套的函数作为外部函数的返回值返回。

函数定义时的作用域链到函数调用时依然存在。当调用JavaScript函数时,创建一个对象用于保存局部变量,并将这个对象添加到函数作用域链中。当函数返回(结束)时,将这个对象从作用域链删除。然后根据JavaScript垃圾回收规则:

1.不存在嵌套函数,也没有指向这个对象的引用,被当做垃圾回收(从内存中删除)

2.存在嵌套函数,但嵌套函数保存在外部函数,嵌套函数与其内变量被当做垃圾回收(从内存中删除)

3.存在嵌套函数,并将它作为返回值或保存在属性里,这时会有外部引用指向这个太嵌套的函数,这个嵌套函数与其内变量就不会被当做垃圾回收(从内存中删除)

 

4.实例:

例如1:

function Func1(){  var num = 10;  function Func2(){    return ++num;   //先加后返回  }  return Func2;}//注:调用Func1时,其内的Func2()没有运行,Func2只是函数声明。var Func3=Func1();   //此时Func3=Func2alert(Func3());   //11alert(Func3());   //12 //若不用这种方法:function Func1(){  var num = 10;  return ++num;}alert(Func1());   //11alert(Func1());   //11//每次调用,都会重新创建num;每次调用结束,都会销毁num。

0 0
原创粉丝点击