Javascript:将函数作为变量传递并执行它

Javascript:将函数作为变量传递并执行它,javascript,Javascript,我正在学习javascript,为此我正在创建一个带有fadein fadeout等功能的简单效果库。一切正常,但它没有执行我传递的功能,以便在效果完成时执行 我得到了错误 element[3] is not a function 我的代码: //add the effect jlqAddEffect(document.getElementById("mainBoard"),"fadeout",10,function(){ alert("done"); //->>>

我正在学习javascript,为此我正在创建一个带有fadein fadeout等功能的简单效果库。一切正常,但它没有执行我传递的功能,以便在效果完成时执行

我得到了错误

element[3] is not a function
我的代码:

//add the effect 
jlqAddEffect(document.getElementById("mainBoard"),"fadeout",10,function(){
    alert("done"); //->>>I dont get this executed when the effect is done
});

//EFFECTS
var effectElements=new Array();
function jlqAddEffect(element,type,speed,func)
{
    var effect=[element,type,setInterval(function(){jlqUpdateEffect(effect);},speed),func];//->>Here i pass the function in the 3d element of the array
    effectElements.push(effect);
    jlqInitEffect(effect);
}

function jlqInitEffect(element)
{
    if(element[1]=="fadein")element[0].style.opacity=0;
    if(element[1]=="fadeout")element[0].style.opacity=1;
}
function jlqUpdateEffect(element)
{
    var done=false;
    if(element[1]=="fadein"){
        if(parseFloat(element[0].style.opacity)<1){
            element[0].style.opacity=parseFloat(element[0].style.opacity)+0.01;
        }
        else done=true;
    }
    if(element[1]=="fadeout"){
        if(parseFloat(element[0].style.opacity)>0){
            element[0].style.opacity=parseFloat(element[0].style.opacity)-0.01;
        }
        else done=true;
    }
    if(done){
        alert("effect done");//->>I get this executed when the effect is done
        element[3](); // ->>here it should be calling the function but it gives me the error
        clearInterval(element[2]);
        effectElements.splice(effectElements.indexOf(element),1);
    }
}

由于我没有传递函数元素[3]不是函数…

当我在Chrome中测试它时,有两个问题:

  • 在将
    effectElements
    变量初始化为数组之前调用
    jlqAddEffect()
    函数,这会导致尝试
    effectElements.push(effect)时出错。通过将
    jlqAddEffect()
    调用移动到代码末尾,可以轻松修复此问题

  • 您的动画永远不会真正完成,因为JavaScript的浮点运算(和/或处理
    不透明度
    属性时出现的奇怪现象)阻止不透明度一直下降到
    0
    。它下降到
    0.0099999999999247
    ,然后“卡住”。您可以通过测试不透明度是否大于
    0.01而不是大于
    0
    来解决此问题


演示:

当我在Chrome中测试它时,出现了两个问题:

  • 在将
    effectElements
    变量初始化为数组之前调用
    jlqAddEffect()
    函数,这会导致尝试
    effectElements.push(effect)时出错。通过将
    jlqAddEffect()
    调用移动到代码末尾,可以轻松修复此问题

  • 您的动画永远不会真正完成,因为JavaScript的浮点运算(和/或处理
    不透明度
    属性时出现的奇怪现象)阻止不透明度一直下降到
    0
    。它下降到
    0.0099999999999247
    ,然后“卡住”。您可以通过测试不透明度是否大于
    0.01而不是大于
    0
    来解决此问题


演示:

对我来说很好。执行
console.log(元素[3])时会发生什么?将
jlqUpdateEffect(effect)
传递到
setinterval
。但是还没有
效果
。@redreggae不要紧,函数运行时会有。哎呀,数组而不是对象:-(在任何情况下,您都是在调用setInterval的结果中付费的。哦,不,您没有误读……请看?数组:-(对我来说很好。当您执行
控制台.log(元素[3])时会发生什么;
?您将
jlqUpdateEffect(effect)
传递给
setInterval
。但是没有
效果
。@redreggae不要紧,函数运行时会有效果。哎呀,数组而不是对象:-(在任何情况下,您都是在支付调用setInterval的结果。哦,不,您没有误读……请参阅?数组:-(
jlqAddEffect(document.getElementById("mainBoard"),"fadein",10);