为什么不能在自引用函数调用中向setTimeout传递参数呢?

Why can't you pass arguments into setTimeout in a self referencing function call?

本文关键字:参数 setTimeout 不能 自引用 函数调用 为什么      更新时间:2023-09-26

我认为有更好的方法,也许有人可以指出我的错误。我通过上下计数来脉冲box-shadow blur css属性,让函数在启动后调用自己。

由于某些原因,我不能将第一次传递的参数传递给setTimeout调用。

关于如何更干净地写这个有什么想法吗?它可以工作,但它甚至可以推广到其他css属性的动画。

var pulseBoxShadowBlurCounter = 0;
var pulseBoxShadowBlurDirection;
$(document).ready(function() { // dom binds
pulseBoxShadowBlur($('#getData-btn'),14,'#fff',100); // start the process
});
function pulseBoxShadowBlur(pulseElement,max,color,delayTime){
var cssInput = '0px 0px '+pulseBoxShadowBlurCounter+'px '+color;
$(pulseElement).css('box-shadow', cssInput);
    if(pulseBoxShadowBlurCounter == max){
        pulseBoxShadowBlurDirection = 1; // backwards
    }
    if(pulseBoxShadowBlurCounter == -5){ // negative num for pause at 0 time
        pulseBoxShadowBlurDirection = 0; // forward
    }
    if(pulseBoxShadowBlurDirection == 0){ 
        pulseBoxShadowBlurCounter++;
    }else{
        pulseBoxShadowBlurCounter--;
    }
setTimeout( "pulseBoxShadowBlur($('#getData-btn'),14,'#fff',100);",delayTime ); // loop
}

您可以:

setTimeout(function() { pulseBoxShadowBlur(element, max, color, delayTime); }, delayTime);

一般来说,传递一些JavaScript代码的字符串版本作为setTimeout()setInterval()的第一个参数是一个坏主意。

必须在闭包中完成,像这样:

setTimeout( function() {
   pulseBoxShadowBlur($('#getData-btn'),14,'#fff',100);
}),delayTime ); 

因为你正在使用jQuery,你可以使用delayqueue这样:

$('#getData-btn').delay(delayTime).queue(function(next) {
  pulseBoxShadowBlur($(this),14,'#fff',100);
  next(); // resume queue
});