let本应具块级作用域,这段JS代码为何返回number与undefined?
问题解释
先看你提供的代码:
function fn() { let ax = bx = 110; ax++; return ax; } fn() console.log(typeof bx) console.log(typeof ax)
你疑惑的核心是**let ax = bx = 110这行代码的执行逻辑和变量作用域**:
- 这行代码不是同时用
let声明ax和bx,而是拆解成两步执行:- 先执行
bx = 110:此时bx没有被任何关键字(let/const/var)声明,JS会自动将其挂载到全局对象(浏览器环境是window,Node.js环境是globalThis),成为全局变量。 - 再把
bx = 110的结果(也就是110)赋值给let ax:ax是用let声明的函数内部变量,仅在fn函数的作用域内有效。
- 先执行
所以执行后的结果逻辑:
- 调用
fn()后,全局的bx已经被赋值为110,所以console.log(typeof bx)输出number。 ax的作用域仅限fn内部,外部代码无法访问,所以console.log(typeof ax)时,ax属于未定义变量,typeof对未定义变量返回undefined。
如果想让bx也成为函数内部的块级作用域变量,需要分开声明:
function fn() { let bx = 110; let ax = bx; // 或者简写为 let bx = 110, ax = bx; ax++; return ax; }
内容的提问来源于stack exchange,提问作者Divyanshu Thakur
相关产品推荐
相关产品推荐

