You need to enable JavaScript to run this app. JavaScript全局与局部变量声明:为何typeof a为undefined、typeof b为number
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript全局与局部变量声明:为何typeof a为undefined、typeof b为number

代码运行结果差异的本质原因

核心语句的执行逻辑拆解

你疑惑的根源是对let a = b = 0;这行语句的执行顺序存在误解:
JavaScript的赋值操作是从右向左依次执行的,这行代码的实际执行流程等价于:

  • 先执行最右侧的赋值b = 0
  • 再把该赋值表达式的返回值(也就是数字0),赋值给左侧用let声明的变量a

a的作用域规则

a是用let在函数内部声明的变量,属于函数局部作用域,它的可访问范围仅在test函数内部。当test执行完成后,函数的执行上下文被销毁,局部变量a会随之被回收,全局作用域中完全没有a的绑定。
而typeof对未声明/全局不存在的变量有容错性,不会抛出错误,只会返回字符串"undefined",因此你得到typeof a的结果是undefined。

b的作用域规则

b从头到尾没有使用let/const/var任何关键字进行声明,在非严格模式下,JavaScript存在隐式全局变量规则:给未声明的变量直接赋值,会自动在全局作用域创建这个变量并完成赋值。
因此b最终是值为0的全局变量,类型为数字,typeof b自然返回"number"。

注意:如果代码运行在严格模式下,给未声明的变量b赋值会直接抛出ReferenceError,不会生成隐式全局变量。

正确声明局部变量的写法

如果需要a和b都是函数内的局部变量,不能直接连写赋值,需要先在同一作用域声明所有变量,正确写法为:

function test() {
  let a, b; // 先在函数作用域声明两个变量
  a = b = 0;
  a++;
  return a;
}

这种写法下a、b都是局部变量,函数执行完成后全局访问不到二者,typeof a、typeof b都会返回"undefined"。


内容的提问来源于stack exchange,提问作者Dhanush Agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 01:15:07