全局变量与函数参数的作用域疑问:为何同名参数会覆盖全局变量?
为什么第一个代码输出
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
相关产品推荐
相关产品推荐

