闭包
来源:互联网 发布:d3.js力导向拖拽 编辑:程序博客网 时间:2024/06/04 23:56
闭包
函数定义的两种方式
- 函数声明
函数声明提升:在执行代码之前都要进行读取函数声明。这样就可以将调用语句放在声明之前。
name();//在这里调用不会报错function name(){ //代码}
- 函数表达式
又叫匿名函数。像普通变量赋值语句,创建一个函数并将它赋值给一个变量。函数表达式必须先赋值后使用,否则会报错!
name();//报错,函数不存在,js找不到var name=function(){}
函数声明和函数表达式的区别:函数声明可以在声明之前可以调用不会报错,但是函数表达式必须在赋值之后才可以调用。
闭包
闭包是有权访问另外一个函数的作用域的变量。创建闭包的最常见的是在函数内部创建函数。在js中,函数即闭包(全局变量中的函数,可以调用全局变量的变量和函数)
函数执行过程
- 创建函数的时候,会创建一个包含全局变量的作用域链,保存在内部属性[[Scope]]中。
- 当函数被调用时,创建函数的执行环境,复制函数[[Scope]]中的作用域链到执行环境的作用域链。
- 创建活动对象,推入执行环境,放在作用域链的顶端。
- 函数执行完毕后,函数退出执行环境,局部变量被销毁,只保存全局变量。
闭包的作用域链
在后台的执行环境中,闭包的作用域链包含自己的作用域、包含函数的作用域、全局作用域。
闭包可以将包含的函数的活动对象包含到自己的作用域链中,闭包的作用域链仍然保存着对其引用,其包含函数的执行环境被销毁后,执行环境的作用域链也被销毁,但是其活动对象仍然保存在内存中。
闭包的特性
- 函数嵌套函数
- 变量不会被垃圾回收机制回收
- 函数可以引用外部函数的变量和参数
闭包的作用
this对象
基于函数执行的环境
- 全局函数中,this等于window
- 匿名函数中,this等于window
- 当函数作为对象被调用时,this等于这个对象
- 用call和apply函数可以指定this
- 函数被上一级对象调用时,this指向上一级。
闭包的应用
- 模仿块级作用域
用匿名函数来模仿块级作用域(私有作用域),匿名函数是个闭包。
(function(){ //块级作用域})();
应用:经常被放在函数的外面,从而限制全局中的变量和函数。
2. 私有变量
私有变量包括:函数参数,函数变量,函数内部定义的函数
3. 闭包用于在对象中创建私有变量。
总结:使用闭包是为了设计私有变量和私有方法。
闭包的优点:避免全局变量的污染,存在私有变量,使一个成员常驻内存。
缺点:闭包会常驻内存,会增大内存使用,使用不当容易造成内存溢出。
阅读全文
1 0
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 50.远程连接服务器 SSH, XDMCP, VNC, XRDP
- 话说 依赖注入(DI) or 控制反转(IoC)
- Android中Png,jpeg格式的亚索实例代码
- Shell脚本中内置命令的解释
- Java泛型详解
- 闭包
- python 多线程的使用
- MOOC清华《程序设计基础》第4章:插入排序(函数写法)
- NameNode决定副本的存放的机制
- SQL注入
- fd_set记录
- 鸟哥Linux学习之——数据流重定向
- TestLink学习五:TestLink1.9.13和JIRA6.3.6的集成
- 弗洛伊德论宗教的起源