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
相关产品推荐
相关产品推荐

