浅谈JS的闭包

简介: 最近正逢过十一,有了大块的时间,可以给自己充充电。于是便开始了《你不知道的JavaScript 上卷》之旅。最开始的几章描述的是JS的相关编译原理,作用域,以及声明提升的相关知识。这些内容虽然很重要,但是不是本文的重点。

最近正逢过十一,有了大块的时间,可以给自己充充电。于是便开始了《你不知道的JavaScript 上卷》之旅。最开始的几章描述的是JS的相关编译原理,作用域,以及声明提升的相关知识。这些内容虽然很重要,但是不是本文的重点。本文的重点是作用域的闭包,为什么呢?因为到现在为止,对这个概念还是云里雾里,所以在这里做下记录。

闭包的定义

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数在当前词法作用域之外执行。

这么说,是不是还是有点不懂。那么我们可以换个说法:无论通过何种方法将内部函数传递到词法作用域之外,他都会持有对原始定义作用域的引用,无论在何处执行这个函数,都会使用闭包。

这么讲还不是很懂?没关系,那么我们可以看一下菜鸟教程对闭包的讲解:

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。直观的说就是形成一个不销毁的栈环境。

还是不太懂? 没关系,让我们来看一下mozilla的定义:

闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量

因为原生的JavaScript是不支持私有变量的,所以闭包相当于对于私有的变量的一种实现。如果没有私有变量的话,那么我们的代码很有可能会出现很多稀奇古怪的问题。熟悉面向对象语言的人(例如 Java),一定知道要把实体类中的属性定义为private的。原因就是从安全性的方面着想,如果谁都可以拿到这个属性,你也不知道他用这个值做了什么操作,到最后就会出现一些诡异的结果。

闭包的理解

定义总是让人感觉到不接地气,我在这里举个简单的例子去解释这个问题,有可能不是很恰当,但是大概可以帮助我们去理解这个问题。

Js的整体思想是由事件驱动的。每个人的身体其实也是事件驱动的,假设现在你的大脑告诉你饿了,然后这个事件就会触发一个下外卖的回调函数,然后你会有三个选择:A公司,B公司,C公司。具体哪个公司的外卖,我们会保存在这个回调函数外部的一个变量中。代码如下:

var Seller = function() {
  var seller = '';
  function sellBy(seller) {
    console.log("我们在用: "+ seller);
  }
  return {
    eleme: function() {
      sellBy('A公司');
    },
    meituan: function() {
      sellBy('B公司');
    },
    baidu: function() {
      sellBy('C公司');
    }
  }   
};
var seller1 = Seller();
var seller2 = Seller();
seller1.eleme();
seller2.meituan();

这个时候A公司,B公司,C公司各自都有一套自己所拥有的方法,每个方法虽然都有seller这个参数,但是参数的值并不相同,他们都是各自隔离开的。就像是咱们定义的seller1和seller2,他们互相都不干扰,互不认识。

咱们在代码中其实经常会使用到闭包,只是咱们自己没有发现。因为大多数情况都是将事件与对应需要做处理的回调函数相互对应上,回调函数其实就是一个闭包。如果稍不留神,闭包带来的问题可能是灾难性的。

结论

闭包是函数和声明该函数的词法环境的组合。

可能我的理解还是比较浅的,有关于更细节的东西可以参考:[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

目录
相关文章
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
16天前
|
JavaScript 前端开发
js 闭包的优点和缺点
【10月更文挑战第27天】JavaScript闭包是一把双刃剑,在合理使用的情况下,它可以带来很多好处,如实现数据封装、记忆功能和模块化等;但如果不注意其缺点,如内存泄漏、变量共享和性能开销等问题,可能会导致代码出现难以调试的错误和性能问题。因此,在使用闭包时,需要谨慎权衡其优缺点,根据具体的应用场景合理地运用闭包。
104 58
|
16天前
|
缓存 JavaScript 前端开发
js 闭包
【10月更文挑战第27天】JavaScript闭包是一种强大的特性,它可以用于实现数据隐藏、记忆和缓存等功能,但在使用时也需要注意内存泄漏和变量共享等问题,以确保代码的质量和性能。
34 7
|
19天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
12 2
|
1月前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
1月前
|
缓存 JavaScript 前端开发
深入了解JavaScript的闭包:概念与应用
【10月更文挑战第8天】深入了解JavaScript的闭包:概念与应用
|
1月前
|
自然语言处理 JavaScript 前端开发
Javascript中的闭包encloure
【10月更文挑战第1天】闭包是 JavaScript 中一种重要的概念,指函数能够访问其定义时的作用域内的变量,即使该函数在其词法作用域之外执行。闭包由函数及其词法环境组成。作用域链和词法作用域是闭包的核心原理。闭包常用于数据隐藏和封装,如模块模式;在异步操作中也广泛应用,如定时器和事件处理。然而,闭包也可能导致内存泄漏和变量共享问题,需谨慎使用。
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript闭包:原理与应用
【10月更文挑战第11天】深入理解JavaScript闭包:原理与应用
19 0
|
2月前
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级