【问题标题】:Local variable returns undefined for unknown reason [duplicate]局部变量因未知原因返回未定义[重复]
【发布时间】:2017-04-12 11:01:34
【问题描述】:

我有这个功能:

getKeyboardStartingPoint() {
    let currentCellNumberElement;

    window.setTimeout(function() {
        $cells.each(function() {
            currentCellNumberElement = $(this).find('[data-number]');
            if (currentCellNumberElement.text().trim().length === 0) {
                currentCellNumberElement.css('background-color', 'orange');
                return false;
            }
        });
    }, 100);

    return currentCellNumberElement;
}

变量 currentCellNumberElement 在顶部的函数中本地声明,在每个循环中处理,然后我尝试提醒它。但是,该变量返回未定义。元素上的 css 更改有效,因此变量确实有一个值,但由于某种原因,当每个循环结束时它变得未定义。这里有什么问题?

【问题讨论】:

  • 我认为基本问题可能是 return false 是从 setTimeout 返回的,所以它最终无处可去,也没有 else 条件,所以函数将返回 false 或未定义。此外,警报发生在 setTimeout 完成之前,因此将始终未定义。
  • @user3094755 return false 停止$.each 循环,所以这部分没问题。
  • 在超时时间内返回变量也不起作用(未定义)。警报或控制台记录超时内的变量确实有效。但是,我需要退货。
  • 你不能。该函数在超时解决之前很久就结束了。

标签: javascript ecmascript-6


【解决方案1】:

在进入循环之前打印 currentCellNumberElement 并为其分配一个值。

我认为你应该这样做:

getKeyboardStartingPoint() {
    let currentCellNumberElement;

    window.setTimeout(function() {
        $cells.each(function() {
            currentCellNumberElement = $(this).find('[data-number]');
            if (currentCellNumberElement.text().trim().length === 0) {
                currentCellNumberElement.css('background-color', 'orange');
                return false;
            }
        });
        alert(currentCellNumberElement);
    }, 100);

}

但就像JJJ说的:这里有完整的解释:Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

【讨论】:

  • 谢谢,我刚刚想通了。但是,我犯了一个错误地警告这个问题。实际上,我需要返回它,但是当我在超时内返回变量时,它也会返回 undefined。
  • 我认为这个答案很好地涵盖了你的问题:stackoverflow.com/questions/19986444/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2016-04-07
  • 2020-05-25
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多