说到闭包就不得不说javascript中作用域的问题,在javascript中有以下三个作用域

  • 全局作用域
  • 函数作用域
  • 块级作用域( ES6 新增)
    然后需要说到自由变量,自由变量就是
  • 一个变量在当前作用域没有定义,但被使用了
  • 向上级作用域,一层一层依次寻找,直到找到为止
  • 如果到全局作用域都没找到,则报错 xx is not defind
    所有的自由变量的查找,是在函数定义的地方,向上级作用域查找 不是在执行的地方
    作用域应用的特殊情况,有两种表现:即构成了闭包
  • 函数作为返回值被返回
function create() {
  const a = 100;
  return function () {
    console.log(a);
  };
}

const fn = create();
const a = 200;
fn(); //100
  • 函数作为参数被传递
function print(fn) {
  const a = 200;
  fn();
}

const a = 100;
function fn() {
  console.log(a);
}
print(fn); //100

一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐