技术问询:为何if代码块内变量被修改?示例中全局变量some_var为何在if块内被修改?
关于代码块内变量被修改的常见原因解答
嘿,这两个问题其实本质上是相通的,我来给你拆解清楚:
一、为何某变量会在if代码块内部被修改?
通常有这几种常见场景:
- 作用域穿透:变量本身属于if块外部的作用域(比如全局作用域、外层函数作用域),在if块里没有用
let/const/var重新声明,直接赋值操作就会修改原作用域的变量。 - 引用类型特性:如果变量是对象、数组这类引用类型,哪怕你在if块里只是修改它的属性或元素,本质上是在操作内存里的同一个引用对象,外部的变量自然会跟着变化。
- 隐式全局变量:如果在if块里给一个未声明的变量赋值,JS会自动把它挂载到全局对象(比如浏览器里的
window)上,看起来像是“修改”了某个变量,其实是不小心创建了全局变量。 - 闭包或异步陷阱:如果if块里有闭包、定时器这类异步操作,变量可能会被共享引用,后续执行时修改了外部变量的值。
二、在示例中,全局变量some_var为何会在if代码块内部被修改?
全局变量的作用域是整个程序的,if代码块属于全局作用域的一部分,不存在块级隔离(除非你用let/const重新声明)。举个直观的例子:
// 全局作用域声明的变量 let some_var = 10; if (true) { // 直接赋值,修改的就是全局的some_var some_var = 20; } console.log(some_var); // 输出 20
如果是引用类型的全局变量,修改属性的逻辑也是一样的:
let some_var = { count: 10 }; if (true) { // 修改对象的属性,全局变量指向的还是同一个对象 some_var.count = 20; } console.log(some_var.count); // 输出 20
反过来,如果在if块里用let/const重新声明some_var,那就是一个块级作用域的局部变量,和全局的some_var就没关系了:
let some_var = 10; if (true) { // 块级局部变量,和全局的some_var无关 let some_var = 20; console.log(some_var); // 输出 20 } console.log(some_var); // 输出 10
内容的提问来源于stack exchange,提问作者mrgloom
相关产品推荐
相关产品推荐

