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

JavaScript函数默认参数调用后残留,如何每次调用重置参数?

函数默认参数保留之前值的问题解决

为什么第二次调用输出"harry"?

你的代码存在两个核心问题:

  • 函数未定义参数:function test()没有声明任何参数,函数内部的name并非局部参数,而是去全局作用域查找变量。
  • 调用时的赋值是全局操作:test(name="harry")这种写法不是给函数传参,而是在全局作用域执行name="harry"的赋值操作,把全局变量name设为了"harry"。

所以第二次调用test()时,函数内部的console.log(name)依然读取全局的name变量,自然输出"harry"。

正确的默认参数写法(不保留之前状态)

要实现「不传参数时用默认值,每次调用状态独立」,你需要给函数显式定义参数并设置默认值。每次函数调用都会创建独立的参数上下文,不会复用之前的调用值。

示例1:默认值为undefined

function test(name = undefined) {
  console.log(name);
  // 注意:原代码中"undefined"是字符串,应直接写undefined
  let result = name !== undefined ? "test" : "welp";
  console.log(result);
}

test("harry"); // 输出: harry \n test
test(); // 输出: undefined \n welp

示例2:默认值为具体内容

如果希望不传参数时name使用固定默认值(比如"guest"),可以直接设置:

function test(name = "guest") {
  console.log(name);
  let result = name !== "guest" ? "test" : "welp";
  console.log(result);
}

test("harry"); // 输出: harry \n test
test(); // 输出: guest \n welp

为什么"use strict"没效果?

use strict的作用是禁止意外创建全局变量,但你调用test(name="harry")时是主动执行全局赋值。严格模式下如果name未提前声明,这行代码会直接抛出ReferenceError,但这并没有解决函数参数的核心问题——你始终没给函数定义局部参数,导致内部依赖全局变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:25:19