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
相关产品推荐
相关产品推荐

