JavaScript嵌套函数参数命名及参数传递逻辑相关疑问
问题解答
首先理清第一个示例中三个name标识的作用域关联
三个name分属不同作用域,完全不会互相干扰:
- 外层
function name()是全局/父级作用域下的函数名,和内部变量无关联 concat的入参name是concat函数的局部变量,仅在concat内部生效,优先级高于外层同名标识concat内部拼接字符串用到的name,就是它自身的局部入参
你调用concat(fullName)时,实际是把外层fullName存储的字符串lawrence Turton复制传递给concat的入参name,这就是两者的关联:入参name拿到的就是外层fullName的值,但两个变量本身存储在不同的内存空间,没有绑定关系。
两种写法的核心区别
两种写法都能正常运行,本质差异是参数命名的语义独立性和变量遮蔽风险:
- 第一种写法(入参名为
name):concat的参数命名完全和外层变量解耦,功能语义清晰,不存在命名冲突风险。后续哪怕外层变量名修改、或者需要给concat传入其他姓名值(比如concat("Bob")),代码逻辑和语义都通顺。 - 第二种写法(入参名为
fullName):concat的入参fullName会**遮蔽(Shadow)**外层的fullName变量,也就是说在concat内部访问fullName时,只会读取自身入参的值,和外层的fullName没有任何绑定关系。你当前测试能跑只是因为调用时刚好把外层fullName的值传给了这个同名入参,后续维护时很容易出现语义混淆:比如你调用concat("Alice")时,入参名是fullName但实际传的是其他值,会给代码阅读造成不必要的误解。
原示例选择第一种写法的原因
完全是遵循函数设计的通用最佳实践:
- 语义更贴合功能:
concat的作用是给任意输入的人名拼接问候前缀,入参命名为name更符合它的通用功能,不需要和调用处的外层变量名绑定 - 避免变量遮蔽:不会和外层的
fullName产生命名冲突,降低后续维护的出错概率 - 复用性更强:如果后续需要把
concat函数抽离到其他场景使用,不需要修改参数名就能直接用
内容的提问来源于stack exchange,提问作者bismarkrogers2020
相关产品推荐
相关产品推荐

