这里直接贴代码: export default function combineReducers(reducers) { // reducers : {} const reducerKeys = Object.keys(reducers) // 获得传进来对象的key const finalReducers = {} // 声明finalReducers 这用来存储最终的reducers for (let i = 0; i < reducerKeys.length; i++) { // 这个循环是用来筛选数据的。 const key = reducerKeys[i] //获得key if (process.env.NODE_ENV !== 'production') { // 如果是生产环境 if (typeof reducers[key] === 'undefined') { // 如果reducers[key] 是 undefinded 抛出错误 warning(`No reducer provided for key "${key}"`) } } if (typeof reducers[key] === 'function') { // 筛选reducers【key】 如果是函数才保存 finalReducers[key] = reducers[key] } } const finalReducerKeys = Object.keys(finalReducers) // 获得 finalReducers keys let unexpectedKeyCache if (process.env.NODE_ENV !== 'production') { unexpectedKeyCache = {} } let shapeAssertionError try { assertReducerShape(finalReducers) // 判断finalReducers的合法性。 } catch (e) { shapeAssertionError = e } // 这里返回一个函数。这个函数就是传入到createStore的函数。 return function combination(state = {}, action) { console.log(shapeAssertionError); if (shapeAssertionError) { throw shapeAssertionError } if (process.env.NODE_ENV !== 'production') { const warningMessage = getUnexpectedStateShapeWarningMessage( // 判断数据的合法性 state, finalReducers, action, unexpectedKeyCache ) if (warningMessage) { warning(warningMessage) } } let hasChanged = false // 是否改变的flag const nextState = {} // 存储最终的state for (let i = 0; i < finalReducerKeys.length; i++) { // 遍历 finalReducerKeys const key = finalReducerKeys[i] // 获得key const reducer = finalReducers[key] // 获得对应的reducer const previousStateForKey = state[key] // 获得key对应的state const nextStateForKey = reducer(previousStateForKey, action) // 获得根据key 改变后的state if (typeof nextStateForKey === 'undefined') { const errorMessage = getUndefinedStateErrorMessage(key, action) throw new Error(errorMessage) } nextState[key] = nextStateForKey // 将改变后的key 存储到 nextState 对应的key hasChanged = hasChanged || nextStateForKey !== previousStateForKey // 判断是否改变,是否需要更新state } return hasChanged ? nextState : state // 如果改变了 返回新的state 没改变则返回旧state。 } }