2012-03-08 77 views
30

我正在學習JavaScript,我不太明白什麼時候寫一個函數到變量中。什麼時候應該將函數存儲到變量中?

例如,以下兩個代碼塊的做同樣的事情的Node.js:

var onReq = function(req, res) { 
    res.write('Hello'); 
}; 

http.createServer(onReq).listen(3000); 

function onReq(req, res) { 
    res.write('Hello'); 
} 

http.createServer(onReq).listen(3000); 



這是根據最好做的最好的方法做法,爲什麼?

+0

對於這個問題,你需要對字符串變量和整數更加集中和浮點變量; – 2012-03-08 13:47:29

+0

http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – jbabey 2012-03-08 14:06:23

+0

重複:http://stackoverflow.com/questions/336859/JavaScript的VAR-functionname功能-VS-功能functionname – 2012-03-08 14:12:52

回答

18

通常我只會使用var funcName = function(){}當我需要重新定義該函數後面的操作時。例如:

var foo = function(a){ return a * 2; } 
var bar = foo(2); 

foo = function(a){ return a/2; } 

bar = foo(bar); 

否則,對於大多數用途(假定它不是一個回調或改性劑)聲明一個函數「經典」通常是可接受的。

+0

我明白你的意思,但它仍然是更好地做到聲明函數的我說右的前一種方法? – imjp 2012-03-08 13:50:12

1

根據John Resig的JavaScript as a First Language文章,您的第一個代碼塊被認爲是最佳實踐。

+4

不要太受那個影響。有很多時候使用函數聲明更可取,並利用它被提升到代碼頂部的事實。可悲的是,他建議'//不要這樣做:函數getData(){}'因爲它可以更容易地將函數作爲對象來教授。讓教學更容易是一個很差的理由,讓初學者開始思考它有什麼問題。 – 2012-03-08 14:30:24

3

下面是一個交代:

有功能被分配給該函數名和變量之間的區別:

  • 函數名稱不能被改變,而可變的功能分配可以重新分配。
  • 函數名稱只能在函數體內使用。試圖在函數體外使用它會導致錯誤(如果函數名稱以前是通過var語句聲明的,則會導致錯誤)。

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

+0

只是一個快速的附錄。 fn聲明中的函數名稱(如MDN使用的術語)可以更改 - 只需將其分配給新變量即可獲得對該函數的另一個引用。稍後在代碼中,函數名稱也可以重新分配給另一個函數(或其他函數)。另一個區別是函數聲明會將分配提升到範圍的頂部,而使用變量只會提升變量的聲明。 – meloncholy 2012-03-08 14:12:17

+0

你的觀點都不正確。對於第一個,你很難看到你在說什麼,但在這兩種情況下,引用該函數的變量都可以被重新分配。第二點是不正確的。如問題所示,函數名稱可以在函數體外部使用。您正在考慮命名的函數表達式,該問題中未顯示。 – 2012-03-08 14:20:15

+0

通過以上重複鏈接之一,kangax的[命名函數表達式揭祕](http://kangax.github.com/nfe/)更詳細地涵蓋了這一點,並且有更多的微妙之處(例如,指出我的評論在提升行爲上實際上可能會因瀏覽器而異)。絕對值得一試。 – meloncholy 2012-03-08 14:36:52

10

我默認爲不可變的function onReq(){}版本。這不是我做出的一個明智的決定,但考慮它會產生這些論點:

  • 它看起來更乾淨。
  • 它在概念上更簡單:它只是一個函數,而另一個是函數和變量。這是一件小事,但我認爲它是有價值的。
  • 它保證我onReq將始終指代函數體 - 閱讀代碼時要考慮的一件事。有點像在Java中將變量標記爲final
  • 使我免於「意外」更換功能,導致其他地方出現意想不到的副作用。
1

我個人也遇到了一些問題,在IE瀏覽器的一些版本使用時不可變的語法(最有可能IE8或更低),而變量語法做工作按預期調用本地函數(其它函數內部聲明函數)。

鑑於函數不應該在全局命名空間中被降級,大多數函數都是局部函數,因此總是對函數使用可變語法是有意義的。

0

我在這裏看到了一些不同的意見,但其中大部分的更多地是基於你認爲是好是壞,但我沒有看到關於何時使用一個或另一個,技術上的原因,但肯定也有技術使用一種聲明公式或其他的限制或優點。我真的是一個JavaScript的初學者,我不覺得有信心提供建議,但我會提出一個在變量中存儲函數不起作用的情況。

在下面的代碼,限定角濾波器,如果我定義一個變量內的功能,那麼我不能成功地從過濾器的方法調用它。任何人都可以解釋我的技術原因嗎?

看到的代碼(評論是不工作):

angular 
    .module('loc8rApp') 
    .filter('formatDistance', formatDistance); 

function formatDistance(){ 
     return function (distance) { 
     var numDistance, unit; 
     if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
      numDistance = parseFloat(distance).toFixed(1); 
      unit = 'km'; 
      } else { 
      numDistance = parseInt(distance * 1000,10); 
      unit = 'm'; 
      } 
      return numDistance + unit; 
     } else { 
      return "?"; 
     } 
     }; 
}; 

var _isNumeric = function (n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
}; 

/* 
var formatDistance = function() { 
    return function (distance) { 
    var numDistance, unit; 
    if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
     numDistance = parseFloat(distance).toFixed(1); 
     unit = 'km'; 
     } else { 
     numDistance = parseInt(distance * 1000,10); 
     unit = 'm'; 
     } 
     return numDistance + unit; 
    } else { 
     return "?"; 
    } 
    }; 
}; 
*/ 

預先感謝您!

相關問題