js事件系统为啥不用这个listener列表而复制一份,只操作复制列表再合并
这个源码?redux/createStore.js at master · reactjs/redux · GitHub======1. 事件触发因为在事件触发的时候,监听器有可能会调用 subscribe / unsubscribe 。而事件触发是这么一个过程for (var i = 0; i \u0026lt; listeners.length; i++) { listeners()}如果某一个监听器调用了 subscribe / unsubscribe ,那么肯定会对 listeners 数组进行修改listeners.push(listener) // subscribelisteners.splice(index, 1) // unsubscribe可想而知,如果你只有一个 listeners 数组,循环体内又去修改 listeners ,最后运行顺序就是一团糟糕。===============2. 保证监听器执行顺序那么一个简单的做法是,循环前把 listeners 复制一份var listenersCopy = listeners.slice();for (var i = 0; i \u0026lt; listenersCopy.length; i++) { listenersCopy()}这样,你在循环体内调用 subscribe / unsubscribe ,改的是 listeners ,不会影响 listenersCopy ,这样就不会影响循环的顺序了,是不是棒棒哒?===============3. 如何优化 .slice()每次事件触发都去 .slice() ,也是一个办法,但是假如监听器内部没有调用 subscribe / unsubscribe 呢?我们这个预防措施是不是白费了?那么优化的方法就是,循环时用上一个监听器数组(currentListeners),subscribe / unsubscribe 修改的是下一个监听器数组(nextListeners = currentListeners.slice()),这样一来,两个数组分开,修改不会影响循环,并且只在必要的时候 .slice() ,开销做到最小。
推荐阅读
- 吉林丰满鱼道系统就绪静待松花江鱼类洄游产卵
- “错换人生28年”事件续:三案均有果当事人及其父母共获赔逾76万元
- 危及铁路运输安全长三角13起事件责任方受到依法约谈
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 银行系统的研发岗(程序员)是不是很难进(校招)推广到国企的研发岗(程序员)呢
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 5.1声道片源对于没有5.1硬件系统的用户来说有意义吗
