【问题标题】:Javascript function is not returning a value even when value is defined [duplicate]即使定义了值,Javascript函数也没有返回值[重复]
【发布时间】:2021-05-21 03:20:47
【问题描述】:

好吧,所以我觉得我错过了一些东西,让我向您展示我编写的一个非常简单的函数。

function findClosestAncestor(html_child_element, html_class_name) {
    if (!html_child_element.parentElement.classList.contains(html_class_name)) {
        findClosestAncestor(html_child_element.parentElement, html_class_name)
    } else {
        return html_child_element.parentElement;
    }
}

当我从我的页面中输入一个子元素时,我会调试这个函数,并且正如预期的那样,它在运行两次后会命中 else 语句。这已通过 Chrome 的开发工具对其进行实时调试得到确认,并且是我希望返回的页面上的元素。但是,当函数被调用并设置为这样的变量时

let parentPanel = findClosestAncestor(e.target, "panel");

parentPanel 在我退出函数后未定义。这让我有点困惑,我可能只是在这里忽略了一些非常简单的事情。发生了什么。

编辑: 根据 Thomas 的建议,我已经测试了 .closest() 这仍然没有返回值。 HTML结构的相关部分如下

                                <div class="list-info">
                                    <div class="container">
                                        <div class="account-type text-title">Type</div>
                                        <div class="account-type-placeholder text-info">Type Placeholder</div>
                                    </div>
                                    <div class="container">
                                        <div class="account-phone text-title">Phone</div>
                                        <div class="account-phone-placeholder text-info">Phone Placeholder</div>
                                    </div>
                                    <hr /> <hr />
                                    <button class="sublist-accordion">
                                        <div class="sublist-title">
                                            Other cases for this Customer
                                        </div>
                                    </button>
                                    <div class="sublist-panel">

我们调用任一方法的元素是您在顶部看到的最终子列表面板。它应该是并且在我的方法成功找到上面的面板类的情况下。但是,它仍然不允许我将其分配为返回值,并且为我的方法和 .closest 都返回 undefined

【问题讨论】:

  • 您可能想在您的if 块中添加return
  • let parentPanel = e.target.closest(".panel"); MDN Element#closest()
  • @Thomas 我无权访问 jquery。
  • @Iptay 这是纯 JS,而不是 jquery。这就是我链接该方法的文档的原因。
  • @Iptay 鉴于您的调试器显示它命中了 else 语句,它是否还显示了 findClosestAncestor 的哪个迭代命中它?如果它是在前一次迭代的 if 部分中没有返回语句的二次迭代,则无法将结果通过调用堆栈传递给原始调用者。 (我会想到)。

标签: javascript


【解决方案1】:

建议的替代方案:

function findClosestAncestor(html_child_element, html_class_name) {
    if (!html_child_element.parentElement.classList.contains(html_class_name)) {
        return findClosestAncestor(html_child_element.parentElement, html_class_name)
    } else return html_child_element.parentElement;
}

关键是你总是需要返回一些东西;不管你选择哪个分支。

【讨论】:

  • 似乎每个人都没有回答这个问题。该值将返回。它确实回来了。我的问题不是关于没有默认返回值会发生什么,而是为什么当它遇到这部分代码时。正如确认发生的那样,它没有返回值 ``` } else { return html_child_element.parentElement; } ```
  • 老兄——如果你想让函数“findClosestAncestor()”返回一个值......并且你没有明确地从所有代码路径返回一个值...... 那是一个错误!也许您遇到了另一个单独的问题或问题。如果是这样,你完全没有把它描述得足够好,以至于任何人都可以帮助你。但从你所说的一切来看,听起来你根本不明白递归函数“应该”如何工作,如here 所述
【解决方案2】:

由于您检查父级是否不包含类html_class_name,它将继续执行该函数,直到找到包含它的函数。但是如果没有父母有班级会发生什么?该函数会一直执行,直到没有更多父项要检查。

您缺少的是递归函数在找不到父对象时的结束!

    function findClosestAncestor(html_child_element, html_class_name) {
        if(!html_child_element.parentElement){
            // What to do here? That's up to you
            // Return the parent?
            // Return the first child?
        }
        if (!html_child_element.parentElement.classList.contains(html_class_name)) {
            findClosestAncestor(html_child_element.parentElement, html_class_name)
        } else {
            return html_child_element.parentElement;
        }
    }

【讨论】:

  • 再次确认返回一个值。我已经对其进行了现场调试。我知道如果没有返回它会出错,因为它最终会到达 DOM 的顶部。
  • 如果是这种情况,您必须向我们提供更多信息,因为这在本地有效。
猜你喜欢
  • 2018-09-21
  • 2012-09-27
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2020-03-25
  • 1970-01-01
  • 2021-07-02
相关资源
最近更新 更多