2012-05-23 143 views
2

是在一些JS代碼性能的工作,看到這種方法:在對象中聲明函數名稱,爲什麼?

window.sample = { 

    foo: function foo(a,b){ 
     // code goes here 
    } 

    bar: function bar(a,b){ 
     // code goes here 
    } 

} 

沒有任何理由,你爲什麼會單詞「功能」後減速功能的名稱?

它有助於調試嗎?

它是好還是壞或者只是不必要?

+2

減速....? – JJJ

+1

啊,你的意思**宣佈** – Joseph

+0

@JosephtheDreamer哦,對。 (「代碼性能」上下文是一條紅色的鯡魚。) – JJJ

回答

1

不是爲foo和bar屬性指定匿名函數,而是分配指定的函數。

它可以爲調試有所幫助:唯一的區別,這使得,我知道的是,你會看到的函數的名稱調用堆棧,而不是「JavaScript的匿名函數」

+0

如果你使用console.log(sample),這是不夠的嗎?然後? – Endless

+0

@Endless我認爲@jbabey意味着錯誤期間堆棧跟蹤。如果它沒有名字,控制檯會說'anonymous function',因爲它沒有名字。 – Joseph

+0

@約瑟夫啊,我明白了 – Endless

4

秀達唯一的理由是,你可以使用函數本身從函數內不會對對象的引用:

foo: function foo(a,b){ 
    return a > 0 ? a + foo(a-1,b) : b; 
} 
,對於名爲函數文本支持

注howeever是跨瀏覽器並不一致,所以你應該避免使用它。

0

這是一個命名函數表達式。該函數的名稱僅作爲函數本身內的變量提供。這對於遞歸有用的,例如:

var obj = { 
    foo: function foo(node) { 
     // Do something to node 

     var childNode = node.firstChild; 
     while (childNode) { 
      foo(childNode); 
      childNode = childNode.nextSibling; 
     } 
    } 
}; 

函數的名稱也是通過功能的非標name屬性,它可以幫助識別功能,同時調試或檢查堆棧跟蹤大多數瀏覽器可用。

IE < 9有一個有缺陷的實現,所以在使用它時需要小心。全部細節可在Juriy Zaytsev's excellent article on the subject中找到。

相關問題