2012-03-08 9 views
30

Obecnie uczę się JavaScript i nie bardzo wiem, kiedy napisać funkcję do zmiennej.Kiedy należy przechowywać funkcję w zmiennej?

Na przykład, oba z następujących bloków kodu zrobić dokładnie to samo w node.js:

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

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

i

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

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



Jaki jest najlepszy sposób to zrobić zgodnie z najlepszą praktyki i dlaczego?

+0

dla tego pytania potrzebujesz więcej koncentracji na zmiennych łańcuchowych i zmiennych całkowitych i zmiennoprzecinkowych; –

+0

http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – jbabey

+0

duplikat: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname –

Odpowiedz

18

Zazwyczaj używam tylko var funcName = function(){}, kiedy będę musiał ponownie zdefiniować działanie (e) dla tej funkcji w późniejszym czasie. Np

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

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

bar = foo(bar); 

przeciwnym razie w większości przypadków (zakładając, że nie jest zwrotna lub modyfikacja) deklarowania funkcji „Klasycznie” jest zwykle do przyjęcia.

+0

Rozumiem, co masz na myśli, ale nadal lepiej jest zrobić pierwszą metodę deklarowania funkcji, o której mówiłem, prawda? – imjp

1

Według artykułu Johna Resiga, JavaScript as a First Language, pierwszy blok kodu jest uważany za najlepszą praktykę.

+4

Nie bądź pod tym wpływem. Często zdarza się, że bardziej pożądane jest użycie deklaracji funkcji i wykorzystanie faktu, że jest ona umieszczona na górze kodu. Smutne, że sugeruje '// Nie rób tego: function getData() {}', ponieważ ułatwia nauczanie funkcji jako obiektu. Ułatwienie nauczania to zły powód, aby zacząć początkujących od pomysłu, że coś jest z nim nie tak. –

3

Oto wyjaśnieniu:

Istnieje różnica między nazwą funkcji i zmiennej funkcja jest przypisana do:

  • Nazwa funkcji nie mogą być zmieniane, podczas gdy zmienna funkcja jest przypisana można ponownie przydzielić.
  • Nazwa funkcji może być używana tylko w treści funkcji. Próba użycia go poza ciałem funkcji powoduje błąd (lub niezdefiniowanie, jeśli nazwa funkcji została wcześniej zadeklarowana za pomocą instrukcji var).

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

+0

Tylko szybki dodatek. Nazwa funkcji w deklaracji fn (jak MDN używa tego terminu) może zostać zmieniona - wystarczy przypisać ją do nowej zmiennej, aby uzyskać kolejne odniesienie do funkcji. Nazwę funkcji można również ponownie przypisać do innej funkcji (lub czegoś zupełnie innego) w dalszej części kodu. Kolejna różnica polega na tym, że deklaracja funkcji spowoduje przeniesienie przypisania do wierzchołka zakresu, podczas gdy użycie zmiennej spowoduje tylko podniesienie deklaracji zmiennej. – meloncholy

+0

Żadne z twoich punktów nie wydaje się poprawne. W przypadku pierwszego trudno jest zobaczyć, co mówisz, ale w obu przypadkach zmienna odwołująca się do funkcji może zostać ponownie przypisana. A drugi punkt nie jest właściwy. Nazwa funkcji może być używana poza ciałem funkcji, jak pokazano w pytaniu. Zastanawiasz się nad nazwanym wyrażeniem funkcji, którego nie ma w pytaniu. –

+0

Za pomocą jednego z powyższych linków kangax [Wyjaśnione wyrażenia funkcji nazwane] (http://kangax.github.com/nfe/) opisuje to znacznie bardziej szczegółowo i z większą subtelnością (np. Wskazał, że mój komentarz zachowanie podczas podnoszenia może faktycznie różnić się w zależności od przeglądarki). Zdecydowanie warte sprawdzenia. – meloncholy

10

I domyślnie niezmiennej function onReq(){} wersji. Nie jest to świadoma decyzja, ale myślę o niej, podając następujące argumenty:

  • Wygląda na czystszy.
  • Jest to koncepcyjnie prostsze: jest tylko funkcją, podczas gdy druga jest funkcją i zmienną. To mała rzecz, ale uważam ją za nieocenioną.
  • Zapewnia mnie, że onReq będzie zawsze odnosić się do , że ciało funkcji - jedno mniej do rozważenia podczas czytania kodu. Coś w rodzaju oznaczania zmiennej jako final w Javie.
  • Chroni mnie przed "przypadkowym" zastąpieniem funkcji, powodując niezamierzone efekty uboczne w innym miejscu.
1

Osobiście napotkałem pewne problemy związane z wywoływaniem funkcji lokalnych (funkcje zadeklarowane w innych funkcjach), gdy w niektórych wersjach IE (najprawdopodobniej IE8 lub niższej) używano niezmiennej składni, podczas gdy składnia zmienna działała zgodnie z oczekiwaniami.

Zważywszy, że funkcje nie powinny być deklowane w globalnej przestrzeni nazw, większość funkcji ma charakter lokalny, dlatego też sensowne jest stosowanie zmiennej składni zawsze dla funkcji.

0

Widzę tutaj różne opinie, ale większość z nich jest bardziej oparta na tym, co uważasz za lepsze, ale nie widzę powodów technicznych, kiedy należy korzystać z tych samych, ale na pewno są techniczne ograniczenia lub korzyści w użytkowaniu jednej formuły deklaracji lub innej. Naprawdę jestem początkującym użytkownikiem javascript i nie mam pewności, że mogę o tym poradzić, ale zaproponuję przypadek, w którym przechowywanie funkcji w zmiennej nie będzie funkcjonować.

W poniższym kodzie, definiując filtr kątowy, jeśli zdefiniuję funkcję wewnątrz zmiennej, nie mogę pomyślnie wywołać jej z metody filtru. Czy ktoś mógłby mi wytłumaczyć techniczne powody?

Zobacz kod (skomentowała nie działa):

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 "?"; 
    } 
    }; 
}; 
*/ 

Z góry dziękuję!

Powiązane problemy