jQuery嵌套函数返回值传递问题:变量未定义如何解决?
问题原因分析
你的npsRangeInput始终是undefined,核心问题在于:
listenerInput函数本身没有任何返回语句,调用它自然返回undefined- 内层
input事件回调里的return值没有意义——事件回调的返回值不会被外层函数捕获,也无法作为listenerInput的返回值传递出来 - 输入事件是异步触发的,你调用
listenerInput时,用户还没操作输入框,根本不可能提前拿到输入值
解决方案
根据需求,有两种常用的处理方式:
方案1:点击按钮时直接获取最新值(最简洁)
不需要提前存储值,在点击确认按钮时直接读取输入框的当前值即可:
// 绑定输入事件(仅做UI更新) const listenerInput = (inputID, labelID, buttonID) => { inputID.on("input", function () { labelID.text($(this).val() + " points"); buttonID.prop("disabled", false); }); } listenerInput($("#npsInput"), $("#rangeV"), $("#qOneConfirmButton")); // 点击按钮时直接获取值 $("#qOneConfirmButton").click(function () { const npsRangeInput = $("#npsInput").val(); console.log(npsRangeInput); });
方案2:用闭包维护实时值(需要实时跟踪值时用)
如果需要在其他地方也能获取输入框的实时值,可以用闭包保存当前值,并返回一个获取值的方法:
const listenerInput = (inputID, labelID, buttonID) => { // 初始化当前值 let currentValue = inputID.val(); labelID.text(currentValue + " points"); inputID.on("input", function () { currentValue = $(this).val(); labelID.text(currentValue + " points"); buttonID.prop("disabled", false); }); // 返回获取最新值的方法 return () => currentValue; } // 拿到获取值的方法 const getNpsValue = listenerInput($("#npsInput"), $("#rangeV"), $("#qOneConfirmButton")); // 点击按钮时调用方法获取值 $("#qOneConfirmButton").click(function () { console.log(getNpsValue()); });
补充说明
- 不要试图从异步事件回调里返回值给外层同步代码——事件触发时机不可控,同步代码执行时事件还没发生,根本拿不到值
- 方案1适合只在点击时需要值的场景,代码最简洁;方案2适合需要在多个地方实时获取输入值的场景
内容的提问来源于stack exchange,提问作者xmaxiy
相关产品推荐
相关产品推荐

