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

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但实际传的是其他值,会给代码阅读造成不必要的误解。

原示例选择第一种写法的原因

完全是遵循函数设计的通用最佳实践:

  1. 语义更贴合功能:concat的作用是给任意输入的人名拼接问候前缀,入参命名为name更符合它的通用功能,不需要和调用处的外层变量名绑定
  2. 避免变量遮蔽:不会和外层的fullName产生命名冲突,降低后续维护的出错概率
  3. 复用性更强:如果后续需要把concat函数抽离到其他场景使用,不需要修改参数名就能直接用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:03