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 )。
嘿,在這種情況下,雖然我不太瞭解代碼中的'this',但你已經調用方法$('div')。functionone.setOptions()?它的目的只是在課堂上內部應用嗎? – anthonypliu 2010-06-28 20:07:30
沒有上下文,目前還不清楚「this」指向什麼。它不必指向當前課程。它可能指向div,就像你用$('div')表示的那樣。所以這段代碼在diff中添加了一個setOptions方法,這樣你就可以執行$('div')。setOptions()。你不能做$('div')。functionone.setOptions(),你不能在這樣的函數中調用函數。 – Sjoerd 2010-06-29 06:22:47