2011-10-30 164 views
0

編寫javascript函數的下列方法是等價的。編寫JavaScript函數的更好方法

也許第一個更清楚。

儘管如此,許多程序員更喜歡第二種方式。

偏好第二個方法的兩種方式有顯着的區別嗎?

第一種方式:

Class.prototype.fn = function() { 
     var obj = { 
      … 
     }; 

     return obj; 
}; 

方式二:

Class.prototype.fn = function() { 

     return { 
      ......... 
      }; 
}; 
+1

個人而言,我不喜歡只有一次使用的變量。你爲什麼認爲第一種方式更清楚?當你看到'return {'你知道你正在返回一個對象。 – nnnnnn

+0

@nnnnnn:那麼,在調試器中單步執行代碼之前,總會希望在返回結果對象之前檢查它。 –

+0

@ T.J。 - 的確如此,我幾乎提到過,有必要在前一天做這件事,但是我仍然發現,如果我調試了一些東西,暫時在這種情況下暫時放置一個單一用途的變量(特別是在JS通常不需要重建項目的小改動)。同一天,我發現自己正在調試別人的代碼,包括一些相當長的函數,我不得不仔細檢查一下哪些變量只用於在一行或兩行聲明和賦值中使用過一次。 – nnnnnn

回答

7

除非你需要通過字面創建後對obj執行操作時,有沒有區別,它只是一種主觀的風格偏好。 (請注意,所述用途可能是代碼,或者在調試過程中,更多的下文。)

因此,例如,這裏有一個真正實用的區別:

Class.prototype.fn = function() { 
     var obj = { 
      subordinate: { 
       foo: function() { 
        if (obj.flag) { 
         doOneThing(); 
        } 
        else { 
         doSomethingElse(); 
        } 
       } 
      } 
     }; 

     return obj; 
}; 

在那裏,你所需要的名字,這樣obj.subordinate.foo()作品。 (不是說我會主張這樣做,但是這是一個當客觀而非主觀區分的例子。)但是除非在初始化之後和返回之前使用它,否則這只是一個主觀的事情。

當然,這種使用不一定在代碼調試時,如果您需要在返回之前檢查返回的內容,則帶有obj變量的表單可能更有用。


也許會有點越野滑雪在這裏,但我認爲它的相關:與你的問題的例子,是一個真正的,實際的,有形的這種區別:

Class.prototype.foo = function() { 
     … 
}; 
Class.prototype.bar = function() { 
     … 
}; 

這:

(function() { 
    function Class_foo() { 
      … 
    } 
    function Class_bar() { 
      … 
    } 

    Class.prototype.foo = Class_foo; 
    Class.prototype.bar = Class_bar; 
})(); 

...這不同之處在於前者的功能沒有名字(屬性指的是他們做的,但而不是功能本身)。在後一種情況下,functions have real names可以幫助您通過顯示調用堆棧中的名稱,斷點列表等來幫助您。

+0

您可以分配和名稱的內部函數,但: 'Class.prototype = { \t條:函數類$巴(){ \t \t \t}, \t \t富:函數類$ foo的( ){ \t \t \t} };' – Esailija

+1

@Esailija:你應該* *能,b你不能在IE8或更早的版本上(和其他JavaScript引擎在不同時間也會出現該錯誤的方面)。如果你嘗試這樣做 - 它被稱爲*命名函數表達式* - 在IE8或更早的版本上,它實際上創建了*兩個完全不同的函數對象*並將函數名稱泄漏到包含範圍中(它不應該)。有關更多信息,請參閱鏈接文章 –

+0

我知道,在舊的IE瀏覽器中創建了兩個函數,但由於我們在一個閉包(根據您的示例),它只泄漏到範圍(而不是全局),它應該不成問題。 – Esailija