JS闭包

什么是闭包

  • 前沿:在 JS 中,当一段代码使用一个变量时,js引擎会顺着作用域链去查找,函数作用域是由函数声明的位置决定的,所以内部函数总是可以访问其外部函数中声明的变量。
  • 闭包:当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是当内部函数引用外部函数的变量时,外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。这些变量可以被闭包中的函数访问和修改,形成了一个封闭的作用域。

闭包还可以这样理解:当函数嵌套时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局作用域下可访问时,就形成了闭包。

示例:

1、调用多个闭包:
function cr
eateCounter(){
let i = 0
return function(){
   i++
return i
 }
}
let increase1 = createCounter()
let increase2 = createCounter()
console.log(increase1())  // 1
console.log(increase1())  // 2
console.log(increase2())  // 1
console.log(increase2())  // 2

通过不同的函数调用创建的闭包是不共享的 。在上述例子中,increase1和increase2是通过两次调用createCounter函数创建的闭包,它们之间没有任何共享的状态。每个闭包都有自己的i变量,并且在每次调用闭包时都会递增独立的i变量。所以它们的结果是独立的,并不相互影响。

2、返回多个函数
function createCounter() {
  let count = 0;
  function increase() { 
    count++;
    console.log(count);
  }
  let message = `Count is ${count}`;

  function log() {
    console.log(message, count);
  }

  return [increase, log];
}
const [increase, log] = createCounter();
increase(); // 1
increase();  // 2
increase();  // 3
log(); // Count is 0, 3

请注意,在 createCounter() 函数内部,let message = Count is ${count}; 是在返回闭包之前被声明和赋值。因此,message 变量,及其在闭包中的值,仅与函数定义时的环境相关。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、闭包的定义 闭包是指有权访问另一个函数作用域中的变量的函数 --《JavaScript高级程序设计》 函数对象...
    沐向阅读 2,778评论 0 0
  • 闭包: 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该...
    小裁缝sun阅读 3,777评论 0 5
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 4,685评论 2 6
  • 在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容。之前我对闭包的理解主要是"通过闭包可以在函数外部...
    CodeMT阅读 1,254评论 0 0
  • javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...
    zhengaoly阅读 1,800评论 0 0