You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

全局变量与函数参数的作用域疑问:为何同名参数会覆盖全局变量?

为什么第一个代码输出Hello undefined,第二个却正常?

这个问题的核心是变量遮蔽(variable shadowing),咱们一步步拆解来看:

第一个代码示例的问题

先看你写的第一段代码:

let x = "World"; 
function sayHello(x) { 
  console.log("Hello ", x); 
} 
sayHello();

这里函数sayHello的参数列表里声明了一个x——这个参数本质上就是函数内部的局部变量。当JavaScript执行函数内部代码时,会优先使用当前作用域内的变量,这个局部的x就把全局作用域里的let x = "World"给“盖住”了(也就是遮蔽了)。

而你调用sayHello()的时候没有传任何参数,所以这个局部的x就被默认初始化为undefined,最终console.log输出的就是这个局部的x,也就是Hello undefined。

第二个代码示例为什么正常?

再看修改后的第二段代码:

let x = "World"; 
function sayHello(y) { 
  console.log("Hello ", x); 
} 
sayHello();

这次函数的参数是y,函数内部没有声明任何名为x的局部变量。这时候JavaScript就会沿着作用域链往上查找:先找当前函数作用域,没找到x,就去上一层的全局作用域找,正好找到了let x = "World",所以console.log就会输出这个全局的x,也就是Hello World。

补充一点小规则

JavaScript的作用域查找逻辑是:先当前作用域,再逐层向上直到全局作用域。只要当前作用域内有同名变量(不管是参数声明,还是用let/const/var声明的),都会优先使用内部的变量,外部的同名变量就会被遮蔽,无法在当前作用域直接访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:31:31