浅谈JavaScript中闭包

  借用高程(JavaScript高级程序设计)中对闭包的定义:闭包是指有权访问另外一个函数做用域中的变量的函数。而我想对这句话加一个修饰条件就更能反应闭包的含义了。
  闭包是指在任何地方都有权访问另外一个函数做用域中的变量的函数。
因此,一般咱们会在一个函数里return另外一个函数,这样更能体现 在任何地方,有权访问另外一个函数(外层函数)中的变量。html

下面咱们能够经过一张图来更加直观的理解下,闭包函数为什么能在任何地方都有权访问外层函数内部的变量。闭包

  咱们都知道,控制变量的访问权限这是做用域链的职责(能够参考个人博客),从上图中,咱们能够看出,闭包函数 bibao 的内部属性 [[Scopes]] 上记录了定义当前函数时的做用域链,当执行bibao函数时,会将[[Scopes]]属性取出生成一个做用域链而且将当前函数的活动对象推入做用域链的最顶层,这样,无论在什么位置就都能访问内部函数的属性,如图中的 k 变量。函数

  ⚠️注意,当内部函数没有指向或者引用内部函数中的变量时,这个时候,内部函数是不会构成闭包的,请参考下图。spa

 

  如上图所示,闭包函数内部属性 [[Scopes]] 中没有外层函数的活动对象,因此执行该函数时没法访问外层函数的变量 k。所以,当内层函数中没有引用外层函数中的变量时,就不会构成一个闭包函数。设计

相关文章
相关标签/搜索