mulberry32工厂函数如何返回有状态函数?求原理解释
关于mulberry32有状态函数的实现原理解释
以下代码返回一个有状态函数。尝试多次调用该工厂函数生成的输出函数,重新生成后再次调用,会发现输出一致,说明它在多次调用间保留了状态。
但我不太清楚这是如何实现的……能否有人解释?
function mulberry32(a) { return function() { var t = a += 0x6D2B79F5; t = Math.imul(t ^ t >>> 15, t | 1); t ^= t + Math.imul(t ^ t >>> 7, t | 61); return ((t ^ t >>> 14) >>> 0) / 4294967296; } }
这个逻辑的核心是**闭包(Closure)**机制,具体拆解:
- 当你调用
mulberry32(a)时,这个外部函数会创建一个局部变量a,随后返回内部的匿名函数。 - 内部函数在定义时就"抓"住了外部函数的
a变量——哪怕外部函数mulberry32执行完退出了,内部函数依然保留着对这个a的引用,这个被保留的变量就成了内部函数的私有状态。 - 每次调用内部函数时,
a += 0x6D2B79F5会直接修改这个被捕获的a的值,修改后的结果会被存下来,供下一次调用内部函数时继续使用。 - 如果你用同一个初始值重新调用
mulberry32,会生成一个全新的a变量和对应的内部函数,所以新函数的调用序列会和之前的完全一致——因为它是从新的初始a开始计算的。
举个直观的例子:
// 用初始值1生成第一个随机函数 const rand1 = mulberry32(1); console.log(rand1()); // 第一次调用,修改了内部的a console.log(rand1()); // 第二次调用,基于修改后的a继续计算 // 用同样初始值1生成第二个随机函数 const rand2 = mulberry32(1); console.log(rand2()); // 和rand1的第一次输出完全一致,因为rand2的a是全新的初始值1
内容的提问来源于stack exchange,提问作者user1543574
相关产品推荐
相关产品推荐

