知识卡片

函数作为对象可携带自身持久状态

专业/工作 · 415

内容

JavaScript里函数不是纯语法结构而是一等对象,因此它可以像普通对象一样拥有自己的属性,这个属性在函数每次被调用之间是持久保留的。这给”跨调用记住点什么”提供了一个介于全局变量和闭包私有变量之间的选项:比起全局变量,挂在函数属性上的状态不会污染全局命名空间、语义上明确归属于这个函数;比起闭包私有变量,它是可以从外部读取和调试的,适合那些”需要缓存但不介意被外部窥视”的场景,比如给递归函数的阶乘计算结果按参数值缓存(factorial[n]=…),或者给某个中间态数据打上跨调用共享的标记。选择用函数属性还是闭包变量本质上是在”要不要对外暴露这份状态”之间做取舍。

参考来源

《JavaScript权威指南(原书第6版)》第8章《函数》