开发者问题收集

Chrome 中未捕获的 RangeError:超出最大调用堆栈大小

2015-12-21
520

我一直收到来自 JavaScript 的此错误。每次我选中/取消选中 ckhDirectDebit 复选框时都会发生这种情况。

这是代码:

<script type="text/javascript">
    $(document).ready(function () {
        var isDirectDebitSelected = $('#<%=chkDirectDebit.ClientID%>');
        var sameAsMerchantBankCheckbox = $('#<%=chkSameAsMerchantBank.ClientID%>');
        var sameAsMerchantBankLabel = $('#<%=txtSameAsMerchantBank.ClientID%>');

        function setSameAsMerchantVisible() {
            if (isDirectDebitSelected.is(':checked')) {
                sameAsMerchantBankCheckbox.show();
                sameAsMerchantBankLabel.show();
            } else {
                sameAsMerchantBankCheckbox.hide();
                sameAsMerchantBankLabel.hide();
            }

            isDirectDebitSelected.bind('change', function () {
                setSameAsMerchantVisible();
            });

            setSameAsMerchantVisible();
        }
    });
</script>

<asp:CheckBox runat="server" ID="chkDirectDebit" />
<asp:Label runat="server" AssociatedControlID="chkSameAsMerchantBank" ID="txtDirectDebit" meta:resourcekey="lblDirectDebit"></asp:Label>
<asp:CheckBox runat="server" ID="chkSameAsMerchantBank" OnCheckedChanged="chkSameAsMerchantBank_CheckedChanged" AutoPostBack="True" Checked="True" />
<asp:Label runat="server" AssociatedControlID="txtSameAsMerchantBank" ID="txtSameAsMerchantBank" meta:resourcekey="lblSameAsMerchantBank"></asp:Label>

有人知道我在 js 中做错了什么吗?导致此异常的潜在问题是什么?

3个回答

您有无限递归,因为 setSameAsMerchantVisible 内部再次调用了 setSameAsMerchantVisible ,且没有任何条件。
似乎您打错了,应该将右括号稍微向上移动一点

function setSameAsMerchantVisible() {
    if (isDirectDebitSelected.is(':checked')) {
        sameAsMerchantBankCheckbox.show();
        sameAsMerchantBankLabel.show();
    } else {
        sameAsMerchantBankCheckbox.hide();
        sameAsMerchantBankLabel.hide();
    }
} // <-- to here
    isDirectDebitSelected.bind('change', function () {
        setSameAsMerchantVisible();
    });

    setSameAsMerchantVisible();

//} from here 
Grundy
2015-12-21

这种情况可能在程序陷入无限循环时发生。

您正在递归调用函数 setSameAsMerchantVisible()

Nishad K Ahamed
2015-12-21

发生这种情况是因为您的代码由于递归调用而陷入无限循环,如下所示 -

 function setSameAsMerchantVisible() {

// other code  
            setSameAsMerchantVisible();
        }

由于递归调用导致堆栈溢出。

DfrDkn
2015-12-21