export function createContext<T>(
// 默认值
defaultValue: T,
// 判断新老变化
calculateChangedBits: ?(a: T, b: T) => number,
): ReactContext<T> {
// calculateChangedBits 类型校验
// ...
// 创建 context 实例,同时其实也是 Consumer
const context: ReactContext<T> = {
$$typeof: REACT_CONTEXT_TYPE,
_calculateChangedBits: calculateChangedBits,
// As a workaround to support multiple concurrent renderers, we categorize
// some renderers as primary and others as secondary. We only expect
// there to be two concurrent renderers at most: React Native (primary) and
// Fabric (secondary); React DOM (primary) and React ART (secondary).
// Secondary renderers store their context values on separate fields.
_currentValue: defaultValue,
_currentValue2: defaultValue,
// These are circular
Provider: (null: any),
Consumer: (null: any),
};
// 创建 Provide 元素
context.Provider = {
$$typeof: REACT_PROVIDER_TYPE,
_context: context,
};
// 开发时非法使用的错误抛出
// ...
// 将 Consumer 指向 context 自身
context.Consumer = context;
return context;
}