2014-02-08 20 views
-1

這一定很容易,但我看不到它。需要另一個(更聰明)的眼睛。

這工作:

$('#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); 
    } 
); 

我在想什麼?

+0

嘗試'setTimeout(function(){ alert($ this.attr('id')); },800);' – Satpal

+0

什麼是html? –

回答

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(){才能檢索外部變量。

+0

我很欣賞這個解釋(非常),但我不明白這一點:爲什麼$ this(一個jQuery對象)在函數內部可用而沒有被傳入INTO函數?這不是全球性的...?另外,如何將jQuery對象傳遞給函數?或者是因爲第二個函數在第一個函數內? – gibberish

+0

@gibberish右邊,內部函數繼承了外部函數的範圍(實際上來自所有周圍的範圍,包括全局範圍)。因此,不需要將變量傳遞給內部函數,因爲它已經在外部函數中可用。這是我的第一個代碼塊告訴的。對於這個問題,你應該圍繞這個主題進行一些實驗到你的瀏覽器控制檯(F12> copy-paste> ENTER)。這裏有一篇文章可能會有更好的幫助,希望:http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html。 – leaf

+0

我不知道爲什麼我沒有接受這個問題的正確答案。幸運的是,今天有人低估了這個問題,我被帶回了這裏。最後......我已經做好了你的回答。對不起我的...(這個諷刺會殺死我......)*拖延* ... – gibberish

1

你並不需要通過$this如放慢參數在setTimeout功能

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

DEMO