@@ -55,9 +55,16 @@ export default function createStore(reducer, initialState, enhancer) {
5555
5656 var currentReducer = reducer
5757 var currentState = initialState
58- var listeners = [ ]
58+ var currentListeners = [ ]
59+ var nextListeners = currentListeners
5960 var isDispatching = false
6061
62+ function beforeMutatingListeners ( ) {
63+ if ( nextListeners === currentListeners ) {
64+ nextListeners = currentListeners . slice ( )
65+ }
66+ }
67+
6168 /**
6269 * Reads the state tree managed by the store.
6370 *
@@ -95,17 +102,21 @@ export default function createStore(reducer, initialState, enhancer) {
95102 throw new Error ( 'Expected listener to be a function.' )
96103 }
97104
98- listeners . push ( listener )
99105 var isSubscribed = true
100106
107+ beforeMutatingListeners ( )
108+ nextListeners . push ( listener )
109+
101110 return function unsubscribe ( ) {
102111 if ( ! isSubscribed ) {
103112 return
104113 }
105114
106115 isSubscribed = false
107- var index = listeners . indexOf ( listener )
108- listeners . splice ( index , 1 )
116+
117+ beforeMutatingListeners ( )
118+ var index = nextListeners . indexOf ( listener )
119+ nextListeners . splice ( index , 1 )
109120 }
110121 }
111122
@@ -160,9 +171,9 @@ export default function createStore(reducer, initialState, enhancer) {
160171 isDispatching = false
161172 }
162173
163- var currentListeners = listeners . slice ( )
164- for ( var i = 0 ; i < currentListeners . length ; i ++ ) {
165- currentListeners [ i ] ( )
174+ var listeners = currentListeners = nextListeners
175+ for ( var i = 0 ; i < listeners . length ; i ++ ) {
176+ listeners [ i ] ( )
166177 }
167178
168179 return action
0 commit comments