闭包

来源:互联网 发布:d3.js力导向拖拽 编辑:程序博客网 时间:2024/06/04 23:56

闭包

函数定义的两种方式

  • 函数声明
    函数声明提升:在执行代码之前都要进行读取函数声明。这样就可以将调用语句放在声明之前。
name();//在这里调用不会报错function name(){    //代码}
  • 函数表达式
    又叫匿名函数。像普通变量赋值语句,创建一个函数并将它赋值给一个变量。函数表达式必须先赋值后使用,否则会报错!
name();//报错,函数不存在,js找不到var name=function(){}

函数声明和函数表达式的区别:函数声明可以在声明之前可以调用不会报错,但是函数表达式必须在赋值之后才可以调用。

闭包

闭包是有权访问另外一个函数的作用域的变量。创建闭包的最常见的是在函数内部创建函数。在js中,函数即闭包(全局变量中的函数,可以调用全局变量的变量和函数)

函数执行过程

  1. 创建函数的时候,会创建一个包含全局变量的作用域链,保存在内部属性[[Scope]]中。
  2. 当函数被调用时,创建函数的执行环境,复制函数[[Scope]]中的作用域链到执行环境的作用域链。
  3. 创建活动对象,推入执行环境,放在作用域链的顶端。
  4. 函数执行完毕后,函数退出执行环境,局部变量被销毁,只保存全局变量。

闭包的作用域链

在后台的执行环境中,闭包的作用域链包含自己的作用域、包含函数的作用域、全局作用域。

闭包可以将包含的函数的活动对象包含到自己的作用域链中,闭包的作用域链仍然保存着对其引用,其包含函数的执行环境被销毁后,执行环境的作用域链也被销毁,但是其活动对象仍然保存在内存中。

闭包的特性

  • 函数嵌套函数
  • 变量不会被垃圾回收机制回收
  • 函数可以引用外部函数的变量和参数

闭包的作用

this对象

基于函数执行的环境

  1. 全局函数中,this等于window
  2. 匿名函数中,this等于window
  3. 当函数作为对象被调用时,this等于这个对象
  4. 用call和apply函数可以指定this
  5. 函数被上一级对象调用时,this指向上一级。

闭包的应用

  1. 模仿块级作用域

用匿名函数来模仿块级作用域(私有作用域),匿名函数是个闭包。

(function(){    //块级作用域})();

应用:经常被放在函数的外面,从而限制全局中的变量和函数。
2. 私有变量
私有变量包括:函数参数,函数变量,函数内部定义的函数
3. 闭包用于在对象中创建私有变量。

总结:使用闭包是为了设计私有变量和私有方法。
闭包的优点:避免全局变量的污染,存在私有变量,使一个成员常驻内存。
缺点:闭包会常驻内存,会增大内存使用,使用不当容易造成内存溢出。

原创粉丝点击