2013-02-24 35 views
26

Poniższy fragment kodu jest testem umożliwiającym sprawdzenie, co dzieje się, gdy funkcja i zmienna mają tę samą nazwę w tym samym zasięgu. W Chrome wydaje się, że definicja zmiennych ma pierwszeństwo w odniesieniu.Funkcja i zmienna o tej samej nazwie

  1. Czy wymieniona funkcja może zostać wykonana, czy jest całkowicie zaciemniona przez deklarację zmiennej?
  2. Czy to standardowe zachowanie w JavaScript, że zmienne mają pierwszeństwo przed funkcjami o tej samej nazwie?

Przepraszamy za pytanie dwuczęściowe, ale wydawało się marnotrawstwo, aby zadać dwa osobne pytania.

Kod:

<!DOCTYPE html> 
    <head> 
     <meta charset="utf-8"> 
     <title></title> 
    </head> 
    <body> 
     <script> 

      var overlapping = function() { return 'this is a var holding an anonymous function' }; 

      function overlapping() 
      { 
       return 'this is a function definition'; 
      } 

      output(overlapping, 'overlapping'); 
      output(overlapping(), 'overlapping()'); 

      function output(expression, description) 
      { 
       document.writeln('<li>' + (description ? ('<i>' + description + '</i>: ') : '') + expression + '</li>'); 
      } 
     </script> 
    </body> 
</html> 
+4

Zgaduję, że JavaScript wciągniki funkcje do góry, dzięki czemu definicji zmiennej wystąpić po definicji funkcji. Dlatego ta ostatnia definicja - zmienna - jest używana. –

Odpowiedz

15

W JavaScript, definicje funkcji są podciągnięta do góry bieżącego zakresu. Dlatego Twój przykładowy kod brzmi:

var overlapping = function() { return 'this is a function definition' }; 
var overlapping = function() { return 'this is a var holding an anonymous function' }; 

To jest jakiś dobry odczyt na ten temat: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+2

Świetny artykuł. Fakt, że można nadpisać nazwaną funkcję dowolną wartością, wydaje się naprawdę problematyczny, chociaż musi istnieć pewna przewaga nad projektem. Wracając do tego pytania, założyłem, że zmienna i funkcja były przechowywane jako dwa dyskretne elementy, ponieważ nie zgłoszono błędu. –

+2

Również użyteczne: 1) http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname 2) http://javascriptweblog.wordpress.com/2010/07/06/function -deklaracje-kontra-funkcje-wyrażenia / –

Powiązane problemy