对象是穷人的闭包,闭包是穷人的对象

Feb 10, 2023

本篇博客默认各位已经接触过 JS 函数,并且对 闭包 有一定的理解

我对函数的理解

一个或多个语句组成完成特定功能相对独立 的代码就叫做函数

但是,在之前这可不叫做函数,这叫「子程序」

最开始程序员写的程序大部分是「汇编」,后来才有的 CCPP 之类的语言,但那个时候没有「函数」这个概念,它只有一个叫做「子程序」

「子程序」是什么呢:比如我们写了很多行代码,其中有 几行代码 是用来完成一些 特定的功能,那么这 几行代码 就取了个名字,叫做「子程序」—— routine

至于为什么叫 routine,这就跟汇编有关了

而这个子程序又分为 3 种,分别为:函数( Function )过程( Procedure )方法( Method )

  • 函数:如果一个「子程序」有返回值,它就叫 函数
  • 过程:如果一个「子程序」没有返回值,它就叫 过程 (因为它只走了个过程,没有任何返回)
  • 方法:如果一个「子程序」在一个 中或者 对象 中,就叫 方法

而在 JavaScript 中,我们没有「子程序」,只有 函数方法

Q:那为什么没有过程呢?
A:因为 JS 的所有 函数 都有 返回值,因为即使你不 return,也是默认返回 undefined

Q:而函数的返回值是由什么决定的呢?
A:调用时 输入的参数 和 定义时 的环境

什么是闭包

我在这篇博客中写的很详细了 用人话阐述 JS 中的「闭包」 请看一遍

我再说一下 闭包 的特点吧

  1. 能让一个 函数 维持住一个 变量
  2. 但并不能维持这个变量的
  3. 尤其是变量的值会 改变 的时候

那我们来玩玩这个闭包吧!

对象是穷人的闭包

  • 对象也可以维持住一个变量
  • 如果一门语言不支持闭包,你可以用对象代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 使用对象
const obj = {
_name: '张三',
printName() {
console.log(this._name)
}
}

// 使用闭包
const printName = function () {
const name = '李四'
return function () {
console.log(name)
}
}()

闭包是穷人的对象

  • 如果一门语言不支持对象,你可以用闭包代理
1
2
3
4
5
6
7
8
9
10
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 是不是就很像一个对象?

总结

所以,闭包 在函数里面就是用来维持一个变量的,如果用 对象 也可以代替 闭包,用 闭包 也可以代替 对象,它们是可以用来互相代替的

感谢阅读,下次见 :)

OLDER > < NEWER
cd ../