jQuery将$(this)传递给setTimeout fn - 我缺少什么?

时间:2014-02-08 16:48:08

标签: jquery settimeout

这很容易,但我看不到它。需要另一个(更智能)的眼睛。

这有效:

$('#topmenu li').hover(
    function(){
        $this = $(this);
        alert( $this.attr('id') );
    }
);

这有效:

$('#topmenu li').hover(
    function(){
        $this = $(this);
        setTimeout(function($this){
            alert( 'hello' );
        },800);
    }
);

但这不起作用:

$('#topmenu li').hover(
    function(){
        $this = $(this);
        setTimeout(function($this){
            alert( $this.attr('id') );
        },800);
    }
);

我错过了什么?

3 个答案:

答案 0 :(得分:2)

setTimeout callback function

中删除$this
$('#topmenu li').hover(
    function(){
        var $this = $(this);
        setTimeout(function(){
            alert( $this.attr('id') );
        },800);
    }
);

Fiddle Demo

答案 1 :(得分:2)

问题是向函数添加一个参数会在其私有作用域中创建一个局部变量,这可能会掩盖其中一个父作用域中具有相同名称的其他变量。

没有参数:

var $this = 1;
function f() {
    return $this;
}
f(); // 1

使用参数:

var $this = 1;
function f($this) {
    return $this;
}
f(); // undefined
f(2); // 2
$this; // 1

在第一种情况下,函数范围中没有$this变量,因此返回全局定义的$this变量。在第二种情况下,f()会返回undefined,因为$this在本地存在,但默认设置为undefined,而f(2)则返回2,因为本地$this设置为2

关于您自己的情况,$this.attr('id')会崩溃,因为未定义$this。您必须将setTimeout(function($this){替换为setTimeout(function(){才能检索外部变量。

答案 2 :(得分:1)

您无需在$this函数

中将setTimeout作为参数传递
$('#topmenu li').hover(
    function(){
        $this = $(this);
        setTimeout(function(){
            alert( $this.attr('id') );
        },800);
    }
);

DEMO