闭包(Closures)

问题:

  1. 什么是闭包?有什么用?

  2. 闭包涉及到哪些领域(知识点)?

知识点:

闭包

  1. 是指有权访问另一个函数作用域中的变量的函数。----《JavaScript高级程序设计3版 P178》

  2. 从理论角度:所有的函数都是闭包。因为它们都是在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域;

  3. 从实践角度:以下函数才是闭包:

    • 即使创建它的上下文已经销毁它仍然存在(比如,内部函数从父函数中返回)

    • 在代码中引用了自由变量

------------

闭包分析 ----(涉及作用域链的[[Scope]]属性见《作用域链》笔记~

  1. 涉及自由变量(是指在函数中使用的,但既不是函数参数也不是函数局部变量的变量),也就是函数作用域链的[[Scope]]属性

  2. 一系列代码块(在ECMAScript中,指的是函数)和创建该代码块的上下文数据([[Scope]]属性)的结合;

  3. 同一个父上下文中创建的闭包是共用同一个[[Scope]]属性(如果闭包对其中一个[[Scope]]的变量做修改,会影响到其他闭包对变量的读取,也就是说,所有内部函数都共享一个父作用域);

  4. 对于第3点的典型例子:

    闭包(Closures)_第1张图片

    同一个上下文中创建的闭包是共用一个[[Scope]]属性的,但函数激活时,使用的K已经变成3了。

------------

闭包错误理解

  1. 从父上下文中返回内部函数,甚至理解成只有匿名函数才能是闭包。(错误~)

------------

闭包应用

  1. 创建封装的作用域来隐藏辅助对象;

  2. 回调函数;

  3. 延迟调用;

  4. ~~等。





你可能感兴趣的:(JavaScript)