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() ,开销做到最小。


    推荐阅读