4

我有以下 javascript 代码:

   EventsManager.prototype.hideContainer = function()
   {
     var that = this;

     var index = that.getNextUnreadEventIndex();
     if(index !== -1)
     {
         EventsManager.animateHideLeft(function() //<--- passing a function as parameter to another function
         {
             var unreadEvent = that.eventsList.splice(index,1)[0];
             unreadEvent.isEventOnFocus = true;

             that.eventsList.push(unreadEvent);
             that.displayLastEvent();
         });  
     }
   }

这是 EventsManager.animateHideLeft() 函数的代码:

EventsManager.animateHideLeft = function(callback)
{
   var p = document.getElementById("eventsContainer");
   var width = parseFloat(p.style.width);

   if(!width || width === "NaN") width = 200;

   if(width <= 10)
   {
      clearTimeout(fr);
      alert(typeof callback); //<-- this shows "undefined"
      callback();
   }
   else
   {
      width = width - 10;

      p.style.width = width + "px";

      fr = setTimeout(function()
      {
          EventsManager.animateHideLeft();
      }, 50);
  }
};

不幸的是,函数 animateHideLeft 没有按预期工作。当我测试 typeof 回调时,它会提醒“未定义”。

我怎样才能解决这种混乱,所以我得到预期的结果?

4

4 回答 4

5

看起来你只需要callback通过调用 in setTimeout

fr = setTimeout(function()
{
    EventsManager.animateHideLeft(callback);
}, 50);
于 2013-03-20T20:21:12.493 回答
3

您在其他地方缺少回调

 fr = setTimeout(function()
      {
          EventsManager.animateHideLeft(function(){
                ////
        });
}, 50);
于 2013-03-20T20:20:59.640 回答
3

那是因为您从以下位置错误地调用它setTimeout()

EventsManager.animateHideLeft();   // No callback!
于 2013-03-20T20:21:16.977 回答
3

setTimeout你不传递callback到下一个调用:

      EventsManager.animateHideLeft();

将其更改为

      EventsManager.animateHideLeft(callback);

但是,进行测试并不是一个坏主意,typeof callback == "function"因为有时您不需要/不需要回调函数,然后callback();调用会导致异常。

顺便说一句,您不需要clearTimeout(fr);(除非您计划在动画期间多次调用该函数)。

于 2013-03-20T20:22:01.550 回答