JavaScript自定义ErrorType函数调用后无法修改目标输出变量值的问题
问题核心成因
- 该现象的底层原因是JavaScript的原始值值传递规则:当把
correct_rule_wrong_resp作为参数c传入函数时,函数拿到的只是这个变量当时存储的null值的临时副本,并非原变量本身的内存引用。 - 函数内部
c = 1的赋值操作,修改的只是函数作用域内的临时副本,完全不会同步影响函数外部声明的correct_rule_wrong_resp原变量,因此调用完成后原变量的值始终没有发生变化。 - 所有原始类型(数字、字符串、null、布尔值等)的传参都遵循这个规则,只有对象、数组这类引用类型,传参时传递的是值的内存地址引用,函数内的修改才会同步影响外部原变量。
可落地的修正方案
- 方案1:通过函数返回值传递结果,在外部完成赋值
去掉多余的形参c,让函数把判断结果作为返回值输出,调用时直接把返回值赋值给目标变量即可,示例代码:correct = 70; response = 68; correct_rule_wrong_resp = null; function ErrorType (a, b){ if (correct == a && response == b){ return 1 } // 不符合条件时返回原变量的现有值 return correct_rule_wrong_resp } // 调用时接收返回值完成赋值 correct_rule_wrong_resp = ErrorType(70, 68) - 方案2:函数内直接操作全局目标变量
当前声明的correct、response、correct_rule_wrong_resp都是全局作用域的变量,函数本身就可以直接访问修改,完全不需要额外传入c作为形参,简化后的函数写法:function ErrorType (a, b){ if (correct == a && response == b){ // 直接修改外部全局的目标变量 correct_rule_wrong_resp = 1 } } // 调用时只需要传a、b两个参数即可 ErrorType(70, 68) - 方案3:通过引用类型参数传递需要修改的目标
如果确实需要通过参数传值的形式完成外部变量修改,可以把待修改的原始值包裹在对象这类引用类型中传入函数,示例代码:// 把待修改的状态值存在对象中 const respState = { correct_rule_wrong_resp: null } function ErrorType (a, b, state){ if (correct == a && response == b){ state.correct_rule_wrong_resp = 1 } } ErrorType(70, 68, respState)
内容的提问来源于stack exchange,提问作者BenGreenwood
相关产品推荐
相关产品推荐

