首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 回調函數返回值 undefined 問題:`Array.forEach` 不支持直接返回,需用外層變量或 `some/every/find` 替代

     編輯:程式設計綜合問答

錯誤代碼還原

function quchong(e) {
    $("#d1 input").each(function() {
        if ($(this).val() == $(e).val()) {
            return false; // 這裡返回的是 each 的回調函數,不是 quchong!
        }
    });
    // quchong 這裡無返回值 → undefined
}

根本原因

jQuery.each(callback) / Array.forEach(callback) 的 **callback 返回值只能控制迭代繼續/中斷** (`return false` 相當於 `break`,`return true` 相當於 `continue`)**,無法向外層函數傳遞返回值**。

三種修正方案

方案一:外層變量標記(最接近原邏輯)

function quchong(e) {
    let duplicated = false; // 外層變量
    $("#d1 input").each(function() {
        if ($(this).val() == $(e).val()) {
            duplicated = true;
            return false; // 中斷 each
        }
    });
    if (duplicated) return false;
    // 其他邏輯...
    return true;
}

方案二:用 `Array.some()` / `every()` / `find()` (現代、語義精確)

// 原生 JS 數組 (推薦)
const inputs = Array.from(document.querySelectorAll('#d1 input'));
const duplicated = inputs.some(input => input.value === e.value);
if (duplicated) return false;

// 或 jQuery 轉數組
const duplicated = $('#d1 input').toArray().some(input => input.value === e.value);
  • `some`:任一滿足條件返回 `true` 並短路。
  • `every`:全部滿足返回 `true`。
  • `find`:返回第一個滿足條件的元素。

方案三:`jQuery.filter()` 獲取匹配集合

const matched = $('#d1 input').filter(function() {
    return $(this).val() === $(e).val();
});
if (matched.length > 0) return false;

完善後的 `quchong` 函數

function quchong(e) {
    const $e = $(e);
    const val = $e.val();
    const clickHandler = $e.attr('onclick');

    if (clickHandler === 'moveDiv1(this)') {
        // 判斷 d1 區域是否已有相同 value
        const duplicated = $('#d1 input').toArray().some(input => input.value === val);
        if (duplicated) return false;
    }
    if (clickHandler === 'moveDiv2(this)') {
        // 業務邏輯...
        return false;
    }
    return true; // 默認允許
}

避坑口訣

  • `forEach/each/map/filter/reduce` 回調返回值不向外傳遞,只控制內部迭代。
  • 需向外返回請用 `some/every/find/for...of` 配合外層變量。
  • jQuery `each` 中 `return false` = `break`,`return true` = `continue`**。

掌握「迭代方法返回值語義區別」,JS 邏輯 Bug 率大幅下降。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved