JavaScript 中全局变量在函数内修改后为何外部值也改变?-js教程

本文解释 javascript 全局变量的作用域与赋值行为:全局变量仅有一份内存实例,函数内对其重新赋值会直接影响全局状态,而非创建局部副本;若需局部隔离,必须显式用 `let`/`const` 在函数内重新声明同名变量。

在 JavaScript 中,变量的作用域(scope)决定了它在哪里被定义、在哪里可被访问,但作用域不等于副本。你提供的代码中:

let num = 50;

const logNum = () => {
  num = 100; // ⚠️ 没有使用 let/const 声明,这是对全局 num 的直接赋值
  console.log(num);
};

logNum();     // 输出 100
console.log(num); // 仍输出 100

这里 num 是在全局作用域中用 let 声明的——这意味着它是一个块级全局变量(非 var 的函数作用域,但仍是全局可访问的绑定)。当 logNum 函数执行时,num = 100 这一行并未声明新变量,而是查找当前作用域链中最近的 num 绑定。由于函数内部没有用 let num 或 const num 重新声明,JS 引擎向上查找到全局作用域的 num,并将其值由 50 更新为 100。

✅ 关键点总结:

  • 一个标识符,一个绑定:num 是单一的变量绑定,无论在哪访问或修改,操作的都是同一内存位置;
  • 赋值 ≠ 重声明:num = 100 是赋值语句,不是声明语句;只有 let/const/var 开头才是声明;
  • 作用域影响“可见性”,不影响“独立性”:全局变量在函数内可见且可写(除非是 const 声明的不可重新赋值常量),写它就是在改它本身。

? 对比:如何实现“函数内修改不影响外部”?
只需在函数内显式声明同名局部变量,从而屏蔽(shadow)全局变量:

let num = 50;

const logNum = () => {
  let num = 50; // ✅ 新建局部变量,与全局 num 无关
  num = 100;
  console.log(num); // 100
};

logNum();
console.log(num); // 50 ← 全局 num 未受影响

⚠️ 注意事项:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » JavaScript 中全局变量在函数内修改后为何外部值也改变?-js教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3990922+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3990922+
  • 本周更新: 0+
  • 最后更新: 2026-03-16