2010-08-11 101 views
22

我讀到在javascript中使用匿名函數是不好的做法,因爲它可以使調試成爲一種痛苦,但我沒有看到過自己。 JavaScript中的匿名函數真的很糟糕,如果是這樣,爲什麼?匿名函數在JavaScript中是不好的做法嗎?

+0

匿名/ lambda函數是函數式編程的核心功能。您可以在這裏瞭解更多關於它的信息:http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski 2010-08-11 22:38:27

+0

自2010年以來,開發人員工具和構建/模塊策略已經成爲一種漫長的方式。Chrome/WebKit非常棒,FireBug雖然如此,但是足夠了(並且命名函數表達式也可以在視覺上幫助)。無論如何,考慮到它們被使用的次數,這是一個可疑的公理,可能與代碼「太聰明」,很難跟蹤/調試開始......因爲我從來沒有覺得痛苦調試_my_代碼;-) – user2864740 2015-02-11 18:59:23

回答

12

不可以,匿名函數會在整個網頁中的JavaScript中被使用。它可能會使調試更加困難,但還不足以說明它們不應該被使用。

例如,JQuery廣泛使用它們。

有很多時候,當你想在正式聲明的函數中使用它們時,比如當你想限制它們的作用域時。

+6

實際上,這是我停止使用jQuery的一個原因。總是花費比我認爲合理的時間更長的時間來確定錯誤是否是我的代碼中的語法錯誤,我的代碼中是否存在邏輯錯誤,或者jQuery本身有什麼問題。你不得不承認,匿名函數的調用堆棧並不像一個命名的函數那樣讓事情變得非常清晰。 – Kev 2010-08-11 20:12:26

+6

您可以隨時使用[命名函數表達式](http://yura.thinkweb2.com/named-function-expressions/#named-expr)。 – 2010-08-11 20:18:10

7

我想說的相反,lambda(別名)使一些表達式更簡潔。例如,如果將多個事件處理程序綁定到多個事件,則爲每個事件處理程序提供一個函數名稱會很乏味。

即使它調試有點困難,但它更有幫助,更節省時間,但由於函數是匿名的,所以我很少遇到調試問題。編碼時應該使用JSLint來讓你的生活更輕鬆。

5

絕對不是,lambda函數全部用於,幾乎無處不在。

+16

僅僅因爲某物是_common_並不意味着它是_correct_。使用匿名函數可能沒什麼問題,但是說「每個人都這麼做」並不構成一個有效的論證。 – 2011-06-25 16:22:22

+0

深深嵌套的sass是遍佈各地的,但它是完全錯誤的 – 2015-10-02 09:26:01

-3

匿名函數表達式是最好在JavaScript中練習。

+3

索賠由於缺乏支持而被拒絕。 – user2864740 2015-02-11 19:02:06

+4

由於缺乏WHY而被低估。也因爲*普通*練習不一定*最好*練習。 – 2016-02-26 16:36:05

4

正因爲人人都用它們並不能使它們成爲好習慣(大家還記得使用元素進行佈局嗎?)。但是,它們非常棒,因爲它們可以幫助澄清和簡化代碼,減少出錯的機會。

但是,匿名函數不應該太複雜,以至於調試變得困難。在這種情況下,也許最好是做一個新的功能。

+3

您可以隨時使用[命名函數表達式](http://yura.thinkweb2.com/named-function-expressions/#named-expr)。 – 2010-08-11 20:16:11

+3

+1 lemming代碼 – 2010-08-11 21:18:46

+1

@MarcelKorpel:你提供的鏈接已經死了,但我認爲你的意思是你可以選擇添加一個名字到你的匿名函數(使它不再是匿名),如下所示:var fAnonymous =(function nonAnon( ){});'。這當然可以幫助調試。 – palswim 2016-02-26 18:53:40

8

我打算在這裏反對這個流程,並提出匿名函數確實是不好的做法,即使它們被廣泛使用。

1)匿名函數不能重用。

2)根據定義,匿名函數沒有名稱,因此不描述它們的作用。也就是說代碼不是自我記錄。

3)匿名函數不能用單元測試框架隔離測試。

4)我個人認爲他們讓代碼更難以閱讀和調試。雖然你的經驗可能會有所不同

我認爲有些情況下,匿名函數是最好的選擇,作爲一般規則,爲了避免上述缺點,我幾乎總是命名我的函數。

+2

1)匿名函數和閉包可以被重用,每個函數都是有價值的,可以被賦值給一個變量或者作爲函數參數提供 - 這只是一個暴露函數對象的問題,例如在正確的級別/範圍; 2)匿名函數(或函數表達式)可以給出明確的名稱,但在上下文中是「匿名的」; 3)取決於測試的內容,如何測試以及功能對象如何暴露; 4)在「太聰明」的情況下,閉包/ lambda可能會被濫用,但是_terrible coders是可怕的編碼器,即使使用最簡單的程序代碼語句。 – user2864740 2015-02-11 19:04:41

+0

我對你在這裏說的話感到困惑。如果你給一個函數一個名字並且把它分配給一個變量,那它不是一個匿名函數嗎?你能舉一個匿名的例子嗎? – bhspencer 2015-02-11 19:08:39

+0

問題是術語「匿名」功能是一個謊言。真正的術語應該是*函數表達式*或*閉包*甚至* lambda *(這不同於頂級「函數聲明」或「方法」)。因爲如何使用一個「匿名」功能(除了一個IIFE)而沒有* some *的名稱? – user2864740 2015-02-11 19:09:27

0

這裏是我的瀏覽器控制檯:

// Bad 
poopy = function(){} 
// function(){} 
groupy = poopy; 
// function(){} 

// Good 
droopy = function loopy(){}; 
// function loopy(){} 
floupy = droopy; 
// function loopy(){} 

想象一下,你正在調試的東西,你有一個名爲groupy函數名。你輸入它的名字來獲得更多的信息。如果該功能已設置爲不良部分,則不知道原始聲明是什麼。但是,如果您定義了您的函數名稱,就像在Good部分中一樣,那麼您將始終有一個原始函數名稱的跟蹤。

相關問題