本篇博客默认各位已经接触过
JS 函数,并且对闭包有一定的理解
我对函数的理解
一个或多个语句组成、完成特定功能、相对独立 的代码就叫做函数
但是,在之前这可不叫做函数,这叫「子程序」
最开始程序员写的程序大部分是「汇编」,后来才有的 C、CPP 之类的语言,但那个时候没有「函数」这个概念,它只有一个叫做「子程序」
「子程序」是什么呢:比如我们写了很多行代码,其中有 几行代码 是用来完成一些 特定的功能,那么这 几行代码 就取了个名字,叫做「子程序」—— routine
至于为什么叫 routine,这就跟汇编有关了
而这个子程序又分为 3 种,分别为:函数( Function )、过程( Procedure )、方法( Method )
- 函数:如果一个「子程序」有返回值,它就叫 函数
- 过程:如果一个「子程序」没有返回值,它就叫 过程(因为它只走了个过程,没有任何返回)
- 方法:如果一个「子程序」在一个 类中或者对象中,就叫方法
而在 JavaScript 中,我们没有「子程序」,只有 函数 和 方法
Q:那为什么没有过程呢?
A:因为 JS 的所有 函数 都有 返回值,因为即使你不 return,也是默认返回 undefined
Q:而函数的返回值是由什么决定的呢?
A:调用时 输入的参数 和 定义时 的环境
什么是闭包
我在这篇博客中写的很详细了 用人话阐述 JS 中的「闭包」 请看一遍
我再说一下 闭包 的特点吧
- 能让一个 函数维持住一个变量
- 但并不能维持这个变量的 值
- 尤其是变量的值会 改变的时候
那我们来玩玩这个闭包吧!
对象是穷人的闭包
- 对象也可以维持住一个变量
- 如果一门语言不支持闭包,你可以用对象代理
// 使用对象
const obj = {
  _name: '张三',
  printName() {
    console.log(this._name)
  }
}
// 使用闭包
const printName = function () {
  const name = '李四'
  return function () {
    console.log(name)
  }
}()
闭包是穷人的对象
- 如果一门语言不支持对象,你可以用闭包代理
function createPerson(name, age) {
  return function (key) {
    if (key === 'name') return name
    if (key === 'age') return age
  }
}
const person = createPerson('Jack', 18)
person('name') // Jack
person('age') // 18
你看,这个 person 是不是就很像一个对象?
总结
所以,闭包 在函数里面就是用来维持一个变量的,如果用 对象 也可以代替 闭包,用 闭包 也可以代替 对象,它们是可以用来互相代替的