2010-01-09 75 views
0

我不知道为什么,但这段代码不工作?为什么不呢?我想这是因为我在这里有范围问题:SetTimeOut的范围问题

function washAway(obj) { 
    alert($(obj)); // says HTML Object which is fine 
    setTimeout(function() { 
     alert($(obj)); // says undefined 
     $(obj).fadeOut("slow", function() {    
      $(this).remove(); 
     }); 
    }, 2000); 
}; 
+0

它的工作对我来说.. – Nakul 2010-01-09 09:46:32

+0

@Nakul:因为你的'obj'是全球性的,在此期间不会改变,与Aaron的相反。 – Tomalak 2010-01-09 09:52:07

回答

3

在超时函数执行的地方,它无法知道obj是什么 - 它是一个传入设置超时的方法的参数,但里面的函数没有引用它。

另一种方法是写一个jQuery插件,等待它的作用就像在这之前:

function($){ //to protect $ from noConflict() 
    $.fn.pause = function(duration) { 
     $(this).animate({ dummy: 1 }, duration); 
     return this; 
    }; 
} 

然后你可以使用:

$(obj).pause(2000).fadeOut("slow", function() { $(this).remove(); }); 
+0

是的,你也是对的。感谢您的示例代码btw。 – Tarik 2010-01-09 09:55:50

1

任何方式,我找到了我的答案后,几次尝试/错误。但我仍然想知道为什么它没有解决。

下面是代码:

function washAway(obj) { 
    alert($(obj).attr("id")); 
    var a = function() { 
     var _obj = obj; 
     return function() { 
      $(_obj).fadeOut("slow", function() { 
       $(this).remove(); 
      }); 
     }; 
    }; 

    setTimeout(a(), 2000); 
}; 

编辑:我想我理解这里的问题:

因为我们在这里所说的关闭,当washAway执行完毕,该变量OBJ被销毁所以setTimeOut函数回调函数不能使用该资源,因为它在堆栈上不再可用,并且它也不是全局变量。