2013-04-02 18 views
1

我知道我可以定義函數的屬性,然後可以從函數內部訪問。現在,我可以制定的唯一語法涉及兩個語句。是否有表達以下一個更簡潔的方式:我不是在尋找一個解決方案,就是少字符在單個語句中聲明具有額外屬性的JavaScript函數?

function myFunc() { 
    // do some work 
} 
myFunc.myProp = 0; 

- 這是不是代碼高爾夫球。我正在問更多的問題:「是否有不同的函數聲明模式具有這種其他可取的優點?」這幾乎是關於使用閉包的方法(因爲我懷疑答案就在那裏)。

謝謝!

+0

你真的想要一個帶有屬性或普通對象的函數嗎?我會使用一個對象文字:'var obj = {myprop:0}'。 – bfavaretto

回答

2

如果你想從函數本身內部訪問功能的性能尤其是,你最好這樣做:

var theFunction = function() { 
    function theRealFunction() { 
    // the code 
    if (theRealFunction.something == "not whatever") 
     // do something 
    // more code 
    } 

    theRealFunction.something = "whatever"; 
    return theRealFunction; 
}(); 

什麼,做在一個匿名函數包裝起來的函數聲明。通過函數名訪問函數屬性的問題在於,它必須通過在周圍範圍中查找函數的名稱來實現。這很噁心,但至少這樣它涉及一個基本上是私人的範圍。它會工作所得到的函數(返回爲匿名函數的返回值)是否被分配到不同的變量,傳遞給函數的處理函數等

+1

是的,我知道'arguments.callee',但它是邪惡的,嚴格模式下不允許。 – Pointy

+1

我沒有得到arguments.callee的「邪惡」。許多語言提供了對創建當前執行上下文的函數的訪問,爲什麼它在javascript中是邪惡的?我見過提到的唯一問題是,它可以防止一定的優化,因此,儘管它可能是不利的性能,它幾乎沒有邪惡 – RobG

+1

@RobG它會產生很多與優化,顯然,在「嚴」模式,它是不允許的問題。將來,該功能將從語言中刪除。我對這個理論並沒有很好的理解,但是我聽說Brendan Eich自己講的這個錯誤的程度。 – Pointy

2

這真的,真的要看情況。如果你正在尋找私有變量,那麼你可以很容易地從函數返回一個函數 - 一個內部函數將包含對父級作用域的訪問。

var outer_function = (function() { 
    var private_var = "secret", 
     public_var = "public", 

     inner_function = function() { 
      return private_var; 
     }; 

    inner_function.public_var = public_var; 
    return inner_function; 
}()); 

outer_function現在等於inner_function,與具有進出所述封閉數據的益處。任何附加到內部的屬性(以您所做的方式)現在都可以作爲公共屬性outer訪問。

爲此,您可以使用public-static屬性返回一個類的構造函數,其中的封閉變量充當私有靜態屬性,在您構建的「類」的每個實例之間共享。

+1

我們認爲一樣:-)你的觀點是好的,但暴露配置等屬性。在函數本身有時是有用的。當然可以做到這兩點。 – Pointy

+1

@我曾經做過,實際上是'inner_function.public_var = public_var;'。當返回到外部範圍時,您現在可以調用'outer_function.public_var;',它將等於所附''public_var'的值,如果它是一個標量,或者將是一個「指針引用」 public_var',如果它是一個對象/函數/數組......至少在某人修改公開提供的成員的值時,當然是這樣。 – Norguard

+0

好的,是的,我明白了。我不知道我是如何設法錯過的! – Pointy

1

不完全回答你的問題,但如果你想讀了,可以定義JavaScript函數時,可以使用一些不同的設計模式,這是我的話題讀過的最好的文章之一:

http://www.klauskomenda.com/code/javascript-programming-patterns/

+2

只有一種方法可以通過[函數聲明](http://www.ecma-international.org/ecma-262/5.1/#sec-13)來聲明函數。有幾種通過函數表達式和賦值來初始化函數的方法。 – RobG

+0

是啊..我措辭那很糟糕沒有我,我已更新,以反映您的意見@RobG – 2potatocakes

+0

@RobG - 我認爲你的評論在這裏值得一個單獨的答案。無論如何。謝謝! – Tom

相關問題