You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:42:20