2010-06-28 13 views
4

我遇到了這個jQuery插件,我很明白這是如何工作:在javascript函數中,你能設置this.function = function嗎?

$.functionone = function(){ 

    function setOptions(newOptions){ 
     ... 
    } 
    this.setOptions = setOptions; 
} 

什麼我不明白是什麼東西,這實際上呢? this.setOptions = setOptions你可以調用一個沒有括號的函數嗎? this.setOptionssetOptions本身之間有什麼關係?

回答

9

JavaScript中的函數是(幾乎)其他所有對象的對象。當你這樣做:

this.setOptions = setOptions; 

你不調用setOptions功能,你只是一個引用賦值給函數的性質,完全像一個屬性設置爲任何其他對象,就像這樣:

var dt; 
dt = new Date(); 
this.today = dt; 

用的功能,你可以這樣做,所以你可以再打通過屬性的函數(其中規定了this值是屬性的物體,這是很方便)。這是一個有點清晰這是怎麼回事,如果你使用一個不同的名稱屬性比對功能:

function functionName() { ... } // Declares the function 
this.propertyName = functionName; // Sets the property 
functionName();     // Calls the function (with `this` = the global object ["window", on browsers]) 
this.propertyName();    // Also calls the function (but with `this` = the object the property's on) 

你確定的模式,聲明一個函數,然後分別在對象上的引用設置它,經常用於確保生成的函數具有名稱。您可以創建一個功能,並將其綁定到一個像這樣的屬性:

this.setOptions = function() { 
    ... 
}; 

...但隨後的功能沒有(財產的做法,但不是功能),它可以是當您嘗試調試時出現問題,因爲調試器向您顯示各種上下文中函數的名稱(例如調用堆棧)。如果很多你的函數沒有名字,即使引用它們的屬性的確如此,它也會使調試變得困難。 More about anonymous vs. named functions here.(還有在當函數實例化方面有差別,但進入在這裏只會使事情變得複雜。)

你以爲你可以結合起來的東西,像這樣:

this.setOptions = function setOptions() { // <=== DON'T DO THIS 
    ... 
}; 

。 ..雖然這主要起作用,但它觸發Internet Explorer/JScript中的錯誤(它爲該代碼創建了兩個不同的功能,這最多是內存浪費,最壞的情況是一個非常微妙和浪費時間的問題,因爲它是in this question )。

1

函數setOptions僅在添加圓括號時調用:setOptions()。如果你不添加括號,你可以引用一個函數。這就像一個普通的變量,只是它包含一個函數引用而不是其他值。

如果設置爲this.setOptions = setOptions,則對此對象設置功能setOptions,該對象指向與setOptions相同的功能。也就是說,如果您使用this.setOptions()來調用它,則會調用引用的函數。

+0

嘿,在這種情況下,雖然我不太瞭解代碼中的'this',但你已經調用方法$('div')。functionone.setOptions()?它的目的只是在課堂上內部應用嗎? – anthonypliu 2010-06-28 20:07:30

+0

沒有上下文,目前還不清楚「this」指向什麼。它不必指向當前課程。它可能指向div,就像你用$('div')表示的那樣。所以這段代碼在diff中添加了一個setOptions方法,這樣你就可以執行$('div')。setOptions()。你不能做$('div')。functionone.setOptions(),你不能在這樣的函數中調用函數。 – Sjoerd 2010-06-29 06:22:47

相關問題