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。
- JavaScript 4.3 函数高级-闭包
- JavaScript高级之闭包
- JavaScript高级程序设计闭包
- javascript 闭包 -- 函数
- Javascript函数闭包
- javascript函数闭包
- javascript【函数】闭包
- 闭包 ---- 《JavaScript高级程序设计》中的解释
- javascript闭包的高级用法
- 4、JavaScript高级之闭包
- JavaScript高级程序设计闭包学习理解
- javascript 高级系列之闭包(closure)
- 闭包《javascript高级程序设计》笔记
- JavaScript高级程序设计(第2版) 学习笔记:(二)js函数作用域与闭包
- 《JavaScript高级程序设计 第三版》学习笔记 (六) 函数与闭包详解
- javascript高级程序设计第七章(函数表达式、闭包)笔记
- Javascript高级程序设计——15-1.匿名函数和闭包
- 《JavaScript高级程序设计 第三版》学习笔记 (六) 函数与闭包详解
- Docker学习笔记(一)
- 16. 导入开源库 java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins
- Struts2 Action中获得Request,Response,Session对象的几种常用方法
- LeetCode118 Pascal's Triangle
- C# WinForm开发系列之DataRepeater控件的使用(显示数据的基础使用和自定义使用)
- JavaScript 4.3 函数高级-闭包
- 野指针
- eclipse添加egit插件并链接github远程仓库记录
- Android-handler.post和handlemessage的使用对比(下载图片)
- LeetCode119 Pascal's Triangle II
- spfa最短距
- git上传本地分支到github项目分支
- 再见,OI ---GDOI2017爆零记
- 模拟器连接网络