2013-10-09 105 views
3

將屬性或值添加到JavaScript函數是可以接受的嗎?將屬性添加到JavaScript函數是可以接受的嗎?

實施例:

var f = 1; 

function foo (param) { 
    f++; 
} 

var fooFunc = foo; 

fooFunc.dummy = f; 

console.log('fooFunc: ' + fooFunc); 
console.log('fooFunc.dummy: ' + fooFunc.dummy); 

上面示例創建一個功能(foo),然後將其分配給一個新的變量(fooFunc),然後添加dummy屬性fooFunc

運行時,此示例首先打印函數的文本,然後打印期望值(在這種情況下爲1)。當打印功能,它不顯示dummy值的跡象,包括:

fooFunc: function foo(param) { 
    f++; 
} 
fooFunc.dummy: 1 

的jsfiddle這裏 - 打開瀏覽器的JavaScript控制檯來查看日誌消息:http://jsfiddle.net/nwinkler/BwvLf/

爲什麼這項工作? dummy屬性存儲在哪裏,爲什麼我登錄函數時不打印?

最後,即使這是有效的,使用它是一個好主意(或可接受的做法)嗎?我不想就此開始一個開放式的討論,而是看看是否有文件記載的用法,或者讓JavaScript編碼指南中的人士感到沮喪。

回答

3

JavaScript中的所有基本元素(null,undefined,number,string,boolean)都是對象。所以功能基本上是對象。

JavaScript中的對象可以具有屬性和方法,因此也是函數。

所有函數都繼承自Function.prototype,並且具有通過此鏈的某些屬性(名稱,長度)和方法(.call,.apply)。

保留附加到函數本身的屬性有時非常有用,例如緩存信息,調用次數等。這樣使用它沒有任何問題。

更多細節:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

2

讓我們來看看ECMAScript的文檔(這是標準的JavaScript是基於)。這是第三個。版本的它:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

轉到第15章,原生ECMAScript的對象。 15.3>函數對象。

有很多關於您的問題的有趣信息,但值得注意的第一件事是函數是一個對象。 作爲一個對象,它有屬性(預定義的,你可以自己分配)。 例如,嘗試:

console.log('fooFunc.name: ' + fooFunc.name); 

應該在你的情況顯示爲 「foo」。 由於它記錄得相當好,您可以將其作爲標準方式使用,雖然它不是很好的擴展,看起來有點不同尋常。

希望這會有所幫助。

1

這是正常的對象行爲,無論是否「可接受」。

通過使用函數關鍵字,您實際上調用了本地預定義的Function()構造函數。像任何對象構造函數一樣,它在構建它之後返回一個對象。像任何對象一樣,返回的對象可以具有屬性,包括其他函數作爲方法屬性。

var adder = function(a, b){return a+b}; 
adder.subtracter = function(a, b){return a-b}; 
console.log(adder(1,2)); // 3 
console.log(adder.subtracter(1,2)); // -1 

提示:如果您想看到的加法器對象及其減法方法,切換到從控制檯視圖DOM查看運行在控制檯上面的代碼後,然後搜索「加法」。你會在那裏看到對象,然後你可以摺疊看看它是什麼,包括一個減法器對象。

當然,函數對象是一個特殊的本地對象,它可以調用像這樣的函數:adder()並實際運行一些代碼。事實上,一個函數對象很難檢查自定義附加屬性,加上它的本地特殊對象對待(讀取內置的限制行爲),應該給你一個提示,即使可能,附加自定義屬性也不是預期的很好地使用了一個函數對象。

相關問題