函数参数与局部变量同名时,参数先绑定,var声明不报错但赋值会覆盖参数;let/const同名则直接报错;参数本质是可变局部绑定,内层声明会屏蔽外层同名变量。

函数参数和局部变量在作用域中属于同一层级,它们的优先级相同,但声明顺序和赋值时机会影响实际访问结果。关键不是“谁优先”,而是“谁先绑定、谁后覆盖”。
参数和局部变量同名时,参数先被绑定
函数执行前,JS 引擎会先处理形参声明,并用实参值初始化;随后才处理函数体内 var 声明(提升到顶部,但赋值在原位置)。如果两者同名,参数值会先存在,之后 var 声明只是重复声明(不报错),而后续赋值会覆盖参数值。
- 例如:
function fn(a) { var a = 20; console.log(a); }→ 输出 20,因为var a不改变绑定,但a = 20赋值覆盖了参数 - 若改成
let a = 20,则报错:Cannot declare a variable named 'a' in this scope(参数已占用该标识符)
let/const 声明与参数冲突会直接报错
ES6 规定,函数参数作用域与 let/const 声明的作用域重叠时,不允许同名。这不同于 var 的“静默忽略”,而是语法错误。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
function fn(a) { let a = 10; }→ 报错,无法在同一作用域重复声明 - 这是为了防止意外覆盖,强制开发者明确意图
参数本质是可变的局部绑定,不是只读常量
函数参数在非严格模式下可以被重新赋值,行为等同于普通局部变量;在严格模式下也不能重新声明,但赋值仍允许(除非用 const 显式定义)。
立即学习“Java免费学习笔记(深入)”;
-
function fn(x) { x = 100; return x; }→ 返回 100,x 是可写的局部绑定 - 它既不是全局变量,也不是闭包外的引用,仅属于当前调用栈帧的局部环境
嵌套作用域中,内部声明会屏蔽外部同名变量
无论参数还是 let/var 声明,只要出现在内层作用域,就会遮蔽(shadow)外层同名变量,包括父函数的参数或变量。
-
function outer(x) { function inner() { const x = 'inner'; console.log(x); } inner(); }→ 输出 "inner" - 这里 inner 中的
const x屏蔽了 outer 的参数x,与声明类型无关,只取决于作用域嵌套关系

















