gpt4 book ai didi

javascript - 为什么此代码块会产生无限循环?

转载 作者:行者123 更新时间:2023-11-30 10:41:41 25 4
gpt4 key购买 nike

今天早些时候我在玩 fiddle ,试图回答一个问题时发现了一个令人困惑的事情。作为一个 JS 新手,我无法自己调试出了什么问题。我什至尝试检查 jQuery 源中 $.fn.show 的 source0,但无法弄清楚出了什么问题。

HTML:

<input type='text' id='dataBox'/>
<input type='button' value='toggle' id='toggleButton' />​

jQuery 代码:

jQuery(function ($) {
var _oldShow = $.fn.show;
$.fn.show = function (speed, oldCallback) {
return $(this).each(function () {
var obj = $(this),
newCallback = function () {

if ($.isFunction(oldCallback)) {
oldCallback.apply(obj);
}
obj.trigger('afterShow');
};
obj.trigger('beforeShow');
if(speed)
_oldShow.apply(obj, [speed,newCallback]);
else
_oldShow.apply(obj, [newCallback]);
});
}
});


$('#dataBox').bind('beforeShow', function () {
alert('beforeShow');
});


$('#toggleButton').click(function(){
$('#dataBox').show();
});

问题是我犯的一些错误,导致这条线无限次执行 obj.trigger('beforeShow');

因此此 block 中的警报

 $('#dataBox').bind('beforeShow', function () {
alert('beforeShow');
});

似乎没有停止。

不管我想做什么,或者是否可以通过任何其他方式完成,有人可以解释一下我在这里做错了什么。我已经尝试了几个小时,但无法弄清楚。

FIDDLE

最佳答案

让我们来看看这个部分

    if(speed)    
_oldShow.apply(obj, [speed,newCallback]);
else
_oldShow.apply(obj, [newCallback]);

});

_oldShow 之前被分配为 $.fn.show;,并且 .apply() 调用一个参数为数组的函数,并且设置 this 上下文的能力。 (see here)

所以,在函数的最后,我们总是再次调用函数,无限触发beforeShow。

关于javascript - 为什么此代码块会产生无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com