React Native中const声明变量可被修改并生效的原因咨询
为什么const声明的模块变量能被修改并全局生效?
const的本质是“不可重新赋值”,而非值不可变
你在constants.js里用const IS_VIA_DEEP_LINK = false声明的变量,确实不能直接做IS_VIA_DEEP_LINK = true这种重新赋值操作(会报错),但你修改的不是这个变量本身,而是模块导出对象的属性。模块导出对象的属性可被修改
当你用export const导出变量时,React Native的模块系统(Metro)会把这些变量挂载到一个导出对象上。这个对象是普通的JS对象,它的属性没有被冻结,所以你可以通过constants.IS_VIA_DEEP_LINK = true直接修改该属性的取值,绕开了const对变量本身的限制。模块是单例加载的
每个模块在应用启动后只会被加载一次,所有组件导入的constants都是同一个导出对象的引用。所以你在Splashscreen.js里修改了属性值后,其他组件访问这个属性时自然会拿到更新后的值。
注意事项
这种做法违背了“常量文件”的设计初衷,会让代码的状态变化变得隐蔽,难以追踪和维护。如果确实需要全局可变状态,更推荐用:
- React Context API 管理全局状态
- Redux、Zustand 等状态管理库
如果只是需要偶尔修改的变量,也可以把const改成let,明确表明它是可变的;或者用Object.freeze()冻结导出对象,防止属性被意外修改,比如:
// constants.js const constants = { IS_VIA_DEEP_LINK: false, isLoggedIn: 0, T1: "Test1", T2: "Test2" }; Object.freeze(constants); export default constants;
这样再尝试修改属性就会报错(严格模式下),避免误操作。
内容的提问来源于stack exchange,提问作者Vir Rajpurohit
相关产品推荐
相关产品推荐

