SetTimeOut的范围问题

时间:2010-01-09 09:26:28

标签: asp.net javascript jquery

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

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

2 个答案:

答案 0 :(得分: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(); });

答案 1 :(得分: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函数回调函数不能使用该资源,因为它在堆栈上不再可用,并且它也不是全局变量。