JavaScript函数内无法修改参数值的问题排查与解决

javascript函数内无法修改参数值的问题排查与解决

在JavaScript开发中,经常会遇到需要在函数内部修改外部变量的情况。然而,如果传递给函数的是变量的值而非引用,直接修改函数参数并不能改变原始变量的值。本文将针对这一常见问题,提供详细的分析和解决方案。

问题分析

问题的核心在于JavaScript中参数传递的方式。对于基本类型(如数字、字符串、布尔值),函数参数传递的是值的拷贝。这意味着在函数内部修改参数,实际上修改的是拷贝的值,而不是原始变量的值。

在提供的代码中,editFun 函数接收了 expN, expD, expA, expT 这些参数,它们的值在调用时被复制到函数内部的局部变量中。因此,在 editFun 函数内部修改这些局部变量的值,并不会影响到原始的 expName, expDate, expAmount, expType 输入字段的值。

解决方案:传递元素引用

要解决这个问题,需要将输入字段的引用(即DOM元素本身)传递给 editFun 函数,而不是它们的值。这样,在 editFun 函数内部就可以直接通过引用来修改DOM元素的 value 属性,从而更新输入字段的值。

立即学习“Java免费学习笔记(深入)”;

修改后的代码如下:

const expAmount = document.getElementById("exp-amount");const expName = document.getElementById("exp-name");const expDate = document.getElementById("exp-date");const expBtn = document.getElementById("exp-btn");const expType = document.getElementById("exp-type");const table = document.getElementById("table");const tableChild = document.getElementById("table").childNodes;expBtn.addEventListener("click", () => {  const expN = expName; // 传递元素引用  const expD = expDate; // 传递元素引用  const expA = expAmount; // 传递元素引用  const expT = expType; // 传递元素引用  if (expT === "choose-type") {    alert("Please choose the expense type !");    return;  }  const tr = document.createElement("tr");  // Serial No  const td1 = document.createElement("td");  const td1Text = document.createTextNode(tableChild.length - 1);  td1.appendChild(td1Text);  tr.appendChild(td1);  // Expresnse Type  const td2 = document.createElement("td");  const td2Text = document.createTextNode(expT.value);  td2.appendChild(td2Text);  td2.classList.add("expT-data");  tr.appendChild(td2);  // Expense Name  const td3 = document.createElement("td");  const td3Text = document.createTextNode(expN.value);  td3.appendChild(td3Text);  td3.classList.add("expN-data");  tr.appendChild(td3);  // Expense Date  const td4 = document.createElement("td");  const td4Text = document.createTextNode(expD.value);  td4.appendChild(td4Text);  td4.classList.add("expD-data");  tr.appendChild(td4);  // Expense Amount  const td5 = document.createElement("td");  const td5Text = document.createTextNode(expA.value + " Rs");  td5.appendChild(td5Text);  td5.classList.add("expA-data");  tr.appendChild(td5);  // Delete Btn  const td6 = document.createElement("td");  const td6Text = document.createTextNode("Delete");  td6.append(td6Text);  td6.classList.add("del-btn");  tr.appendChild(td6);  const td7 = document.createElement("td");  const td7Text = document.createTextNode("Edit");  td7.append(td7Text);  td7.classList.add("edit-btn");  tr.appendChild(td7);  table.appendChild(tr);  const editBtn = document.getElementsByClassName("edit-btn");  editFun(editBtn, expN, expD, expA, expT);  const delBtn = document.getElementsByClassName("del-btn");  btnFun(delBtn);});// Function for Delete Buttonfunction btnFun(delBtn) {  Array.from(delBtn).forEach((e) => {    e.addEventListener("click", (e) => {      const a = e.currentTarget;      a.parentElement.remove();    });  });}// Function for Edit Buttonfunction editFun(editBtn, expN, expD, expA, expT) {  Array.from(editBtn).forEach((e) => {    e.addEventListener("click", (e) => {      const siblings = e.currentTarget.parentElement.childNodes;      expT.value = siblings[1].innerText;      expN.value = siblings[2].innerText;      expD.value = siblings[3].innerText;      expA.value = siblings[4].innerText.split(" Rs")[0];    });  });}

关键修改:

在 expBtn.addEventListener 中,将 const expN = expName.value; 修改为 const expN = expName;。 同样地,对 expD, expA, expT 也进行类似修改。 这样传递给 editFun 函数的是DOM元素本身,而不是它的值。在 editFun 函数中,使用 expT.value = siblings[1].innerText; 来更新输入字段的值。 同样地,对 expN, expD, expA 也进行类似修改。

注意事项

确保传递给函数的是DOM元素的引用,而不是它们的值。在函数内部,使用 .value 属性来访问和修改输入字段的值。注意数据类型转换。 从DOM元素获取的值通常是字符串,可能需要根据实际情况进行类型转换。 例如,如果 expAmount 应该是一个数字,可以使用 parseFloat(siblings[4].innerText.split(” Rs”)[0]) 将其转换为浮点数。代码中的 siblings[4].innerText.split(” Rs”)[0] 用于移除金额后面的 ” Rs” 字符。 在实际应用中,应该根据实际情况进行调整。

总结

通过传递DOM元素的引用,可以在函数内部正确地修改输入字段的值。理解JavaScript中参数传递的方式是解决这类问题的关键。在编写代码时,务必注意区分传递的是值还是引用,并根据实际需求选择合适的传递方式。

以上就是JavaScript函数内无法修改参数值的问题排查与解决的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1581650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何为特定 li 元素应用 CSS 样式?
上一篇 2025年12月22日 22:30:17
解决JavaScript表单验证在本地浏览器中不生效的问题:完善验证逻辑
下一篇 2025年12月22日 22:30:29

相关推荐

  • Java中Spring Test的作用 解析上下文

    Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文

    spring test的主要作用是提供隔离环境以测试spring组件并解析上下文,其核心价值在于简化测试配置。1. 使用@contextconfiguration注解加载测试上下文,可通过xml配置文件或java配置类定义测试专用bean;2. 通过@runwith(springrunner.cla…

    2026年8月25日 用户投稿
    000
  • 抖音小程序如何助力营销?成功案例与玩法解析

    抖音小程序能为品牌带来哪些营销突破? 在流量竞争日益激烈的当下,越来越多品牌将目光投向抖音小程序,试图打通内容与转化之间的最后一环。那么,抖音小程序究竟在营销生态中扮演怎样的角色?它不仅能帮助品牌构建高效的转化路径,还能实现用户资产的长期沉淀。依托于抖音庞大的日活和精准推荐机制,小程序可无缝嵌入短视…

    2026年8月25日
    100
  • Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法

    Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法

    synchronized关键字在java中用于实现线程同步,确保多线程并发访问共享资源时的互斥执行。其主要使用方式包括:1. 同步代码块,通过指定对象作为锁;2. 同步方法,锁为当前对象(this)或类对象(class);3. 静态同步方法,等价于使用类对象作为锁;4. 同步静态变量,通常使用静态对…

    2026年8月25日 用户投稿
    600
  • Java中如何分析线程堆栈 掌握jstack

    Java中如何分析线程堆栈 掌握jstackJava中如何分析线程堆栈 掌握jstackJava中如何分析线程堆栈 掌握jstackJava中如何分析线程堆栈 掌握jstack

    线程堆栈分析是通过查看线程运行状态来定位程序瓶颈或死锁等问题。使用jstack工具可生成jvm线程快照,便于深入分析。获取快照需先找到java进程id,用jps或任务管理器查出,再执行jstack命令并输出到文件。解读堆栈信息时应关注线程状态、名称、id及调用栈,如发现多个线程阻塞在同一锁上,则可能…

    2026年8月25日 用户投稿
    000
  • NovaMorphTo字段新选择:如何解决关联资源创建难题,提升LaravelNova开发效率

    在使用 Laravel Nova 构建后台管理系统时,经常会遇到这样的场景:我们需要在创建某个资源的同时,关联到其他类型的资源。例如,在创建一个文章时,我们可能需要关联到一个新的作者,而不是仅仅从已有的作者列表中选择。默认情况下,Nova 的 MorphTo 字段只能选择已经存在的资源,这在某些情况…

    用户投稿 2026年8月25日
    100
  • Java中如何实现日志 掌握Log4j2

    Java中如何实现日志 掌握Log4j2Java中如何实现日志 掌握Log4j2Java中如何实现日志 掌握Log4j2Java中如何实现日志 掌握Log4j2

    log4j2在性能和功能上优于logback,适用于高并发场景。1.log4j2支持异步日志记录,显著降低性能影响;2.提供更丰富的配置选项与插件系统;3.解决类加载器隔离问题;4.通过定义多个appender可将不同日志级别输出至不同文件,如使用thresholdfilter过滤级别;5.spri…

    2026年8月25日 用户投稿
    000
  • 抖音上架小程序有哪些条件

    要在抖音成功上线小程序,需满足一系列关键要求,主要包括:开发者具备合法资质、功能完整稳定、内容符合法规规范,以及提供优质的用户体验。以下将详细解析每一项具体条件。 拥有合规的开发者身份 想要在抖音发布小程序,首先必须完成开发者身份认证: 企业主体资格:公司需注册为抖音开放平台开发者,并提交营业执照等…

    2026年8月25日
    000
  • Java中FindBugs的特点 分析字节码检查

    Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查

    findbugs是一款静态代码分析工具,通过分析java字节码来发现潜在bug。1. 它能识别空指针异常、资源泄露、死锁和低效代码等常见问题;2. 优势包括非侵入性、可配置性强、支持多种bug模式;3. 局限性包括误报、上下文感知能力有限及配置复杂;4. 可通过maven或gradle轻松集成到项目…

    2026年8月25日 用户投稿
    400
  • 美团外卖会员红包领取入口_美团会员红包领取方法

    首先确认未领取成功的原因,再按步骤操作:1.打开美团APP,点击“我的”进入会员中心领取专属红包;2.通过每日签到完成任务获取奖励;3.在外卖频道参与“膨胀红包”或“神抢手”限时抢券活动;4.下载【氧券】APP,搜索美团红包并跳转领取。 如果您在使用美团外卖时,发现会员专属红包未能自动到账或不清楚如…

    2026年8月25日
    400
  • 抖音、淘宝客户沉淀至私域以增长店铺GMV的策略是什么?

    将抖音与淘宝用户导入私域实现店铺GMV增长的核心策略包括:通过社交内容与直播吸引流量、构建分层会员机制、实施个性化营销提高复购、提升服务品质增强体验感、结合数据洞察优化投放效率。 一. 通过社交内容与直播获取精准流量 抖音和淘宝直播作为高活跃度的内容电商平台,具备强大的引流能力。商家可通过发布高质量…

    2026年8月25日
    000
  • Java中计算对象数组中特定属性的平均值和最大值

    本教程详细介绍了如何在Java中处理包含字符串和整数变量的对象数组,并计算其中特定整数属性(如分数)的平均值和最高值。我们将通过一个`Student`对象数组的示例,演示如何正确设计类、遍历数组、访问对象属性以及实现统计计算逻辑,同时强调正确的Getter方法签名。 在Java开发中,我们经常需要处…

    2026年8月25日
    000
  • 苹果手机掉了怎么追踪位置

    一、提前启用“查找我的 iPhone”功能 在手机丢失之前,务必确认“查找我的 iPhone”功能已经开启。操作方法是:进入手机“设置”应用,点击顶部的 Apple ID 账户,选择“查找”,然后开启“查找我的 iPhone”选项。只有提前开启此功能,才能在设备遗失后进行定位追踪。 二、通过电脑登录…

    2026年8月25日
    000
  • 一把吉他卖出 10 亿后,LiberLive 选择自我革命

    一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命

    如果你是一个社交媒体的高频用户,你很可能已经刷到过不少抱着一把智能吉他弹唱的主播了。 不需要高门槛的学习,无弦吉他给那些不会乐器的人提供了一个机会——用游戏般简单的体验,就能实现抱着吉他弹唱的梦想。自 2023 年 LiberLive 首发初代产品之后,无弦吉他俨然已成为一个新的消费电子赛道。 开创…

    2026年8月25日 用户投稿
    100
  • 抖店订单怎么同步到抖音小程序?自动共享管理方法详解

    同步抖店订单至抖音小程序,是双平台运营中长期困扰商家的技术痛点。不少商家反映,订单数据分散在不同系统中,导致库存不准、发货延迟等问题频发,大幅提升了运营复杂度。实际上,除了依赖外部工具外,企业还可通过接口开发实现自动化同步。本文将详细介绍可行方案,助力商家打通数据链路,实现订单统一管控。 抖店订单为…

    2026年8月25日
    000
  • java中的runnable关键字用途 Runnable接口的3个实现技巧

    java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧

    runnable接口与thread类协同工作的核心机制是:将实现runnable接口的任务对象传递给thread类构造函数,再通过start()方法启动线程。1. runnable接口定义任务逻辑,通过run()方法实现;2. thread类负责执行任务,需将runnable对象传入其构造函数;3.…

    2026年8月25日 用户投稿
    100
  • 抖音加入企业微信有什么用?

    将抖音与企业微信打通,可实现高效引流与深度客户运营。借助抖音的内容曝光能力吸引用户,并将其沉淀至企业微信进行长期维护,有助于提升转化效率和用户忠诚度。本文将深入解析两者联动的核心优势及实际应用方式。 抖音与企业微信协同的价值 精准引流与客户沉淀:通过抖音短视频或直播内容吸引目标受众,在视频中嵌入企业…

    2026年8月25日
    000
  • MAC怎么强制显示或隐藏文件扩展名_macOS访达中文件后缀名显示设置

    1、通过系统设置可全局显示或隐藏文件扩展名;2、使用Command + I打开检查器可临时修改单个文件扩展名显示;3、终端命令可批量控制扩展名显示,需执行defaults write命令并重启访达。 如果您在使用Mac时发现文件的扩展名未显示或意外隐藏,可能导致无法准确识别文件类型。通过调整macO…

    2026年8月25日
    100
  • 抖音小店入驻流程是怎样的?详细入驻步骤

    抖音小店入驻全流程解析 想要成功开通抖音小店,需经历一系列系统化操作和平台审核。以下是完整的入驻流程说明: 一、进入抖音开放平台 注册开发者账号:进入抖音开放平台官网,注册一个开发者账户,并选择“本地自营商家”身份类型。完成相应的开发者认证与身份验证,包括提交企业相关资质文件及基础资料信息[1]“…

    2026年8月25日
    100
  • 告别手动配置!CodeIgniter4AppStarter助你快速搭建PHP应用

    作为一名 PHP 开发者,在开始新的 CodeIgniter4 项目时,我经常需要花费大量时间在配置环境、下载框架、调整目录结构等繁琐的准备工作上。这些重复性的工作不仅耗时,而且容易出错。为了解决这个问题,我发现了 CodeIgniter4 App Starter。 codeigniter4 app…

    用户投稿 2026年8月25日
    000
  • Java中如何实现二分查找 掌握二分查找的算法实现

    Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现

    二分查找是一种高效的查找算法,其核心在于每次比较都排除一半的查找范围,从而快速定位目标值,但要求数据必须有序。实现方式有两种:1. 循环实现通过 while(left <= right) 不断调整 left 和 right 的值,计算 mid = left + (right – l…

    2026年8月25日 用户投稿
    000

发表回复

登录后才能评论
关注微信