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

JS函数带同名参数为何出现变量遮蔽?无参数为何修改全局变量

你的猜测完全正确,这个现象的核心是JavaScript的作用域查找规则和变量遮蔽特性。

示例1输出hello的原因

函数定义时声明的greet参数本身属于函数的局部作用域变量,会直接遮蔽外层同名的全局greet变量。函数内部所有对greet的操作,只会作用在这个局部变量上:

let greet = 'hello'; // 全局作用域下的greet

function salutation(greet) {
    // 此处greet是函数局部参数,和全局greet是完全独立的两个变量
    greet = greet + '!'; // 仅修改局部变量,函数执行结束后局部变量直接销毁
}

// 字符串是基本类型,参数按值传递,此处只是把全局greet的值复制了一份传给局部参数
salutation(greet);
console.log(greet); // 全局greet从未被修改,输出hello

示例2输出hello!的原因

函数没有声明greet参数,局部作用域找不到greet变量时,会按照作用域链向上层查找,最终匹配到全局作用域的greet变量。此时对greet的赋值操作会直接修改全局变量的值:

let greet = 'hello'; // 全局作用域下的greet

function salutation() {
    // 局部无greet变量,向上查找匹配到全局greet
    greet = greet + '!'; // 直接修改全局变量的值
}

// 此处传入的参数没有实际作用,函数未定义参数接收会直接忽略传入值
salutation(greet);
console.log(greet); // 全局变量已被修改,输出hello!

补充说明:如果要在带参数的函数内部修改全局同名变量,可以通过window.greet(浏览器环境)或者globalThis.greet(通用环境)显式指定访问全局变量,绕过局部变量的遮蔽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:04