2011-08-07 53 views
0

我感到困惑的是爲什麼$(this)指向'#navigation a'對象而不是'#navigation_blob'對象?要清楚,我知道$(這)做什麼。在這個例子中,我只是困惑於範圍界定。

謝謝!

來自 「jQuery的新手忍者」:

$('#navigation a').hover(function() { 
    // Mouse over function 
    $('#navigation_blob').animate(
     {width: $(this).width() + 10, left: $(this).position().left}, 
     {duration: 'slow', easing: 'easeOutElastic', queue: false} 
    ); 
}, function() { 
    // Mouse out function 
    var leftPosition = $('#navigation li:first a').position().left; 
    $('#navigation_blob').animate(
     {width:'hide'}, 
     {duration:'slow', easing: 'easeOutCirc', queue:false} 
    ).animate({left: leftPosition}, 'slow'); 
}); 

回答

2

this點上它被調用的上下文。 jQuery將您搜索的元素作爲上下文傳遞,因此this指向'#navigation a'

$(this)需要DOM元素(由this引用)並將其包裝在一個jQuery對象中。

Inside $('#navigation_blob').animate(),this將指向'navigation_blob'

+0

是的,我明白了,但不是'#navigation_blob'的上下文嗎?它返回一個對象不呢?我的意思是不應該內部函數覆蓋什麼*這是指的? – Eugene

+1

是的,但它不會覆蓋。只是因爲它建立了一個新的範圍(JavaScript變量的作用域)。因此,內部函數中的'this'將引用'navigation_blob'而不會在父函數中重寫'this'。如果你想訪問父'this',你需要一個閉包:IN parent:'var self = this;'IN inner function:'$(self); //將導航爲' – Mrchief

+0

謝謝!關於清除它=) – Eugene

1

有確定哪些變量名被綁定到時候幾塊玩:

  1. JS具有的功能範圍和全球範圍內,所以當在全球範圍內執行的代碼,你只會得到一個新的變量,或者在使用var關鍵字定義變量時在函數定義內。否則,當一個函數被定義時,一個變量名將被綁定到該函數所在範圍內的任何東西,這個函數是在考慮嵌套函數定義的情況下,直到全局範圍。
  2. 不像其他變量名稱,this是特殊的;它從來沒有被封閉。這很重要,否則函數定義的範圍將起作用。
  3. 在事件偵聽器中,某些瀏覽器將this綁定到偵聽器註冊的元素,就好像事件偵聽器是元素的方法一樣。 IE(通過版本8)沒有執行此綁定;結果,它被綁定到全局對象(window),與任何其他自由函數(即未綁定到對象的函數)被調用時相同。據我所知,沒有標準解決任何行爲。相關標準應該是DOM事件標準,如ECMAScript Language Binding附錄DOM級別2

#navigation_blobanimate調用不涉及定義一個新的功能,所以this範圍的事件處理程序。 jQuery強制執行非IE綁定行爲,確保this引用#navigation a

相關問題