2013-02-24 9 views
26

Das folgende Code-Snippet ist ein Test, um zu sehen, was passiert, wenn eine Funktion und eine Variable denselben Namen im selben Bereich verwenden. In Chrome scheint die Variablendefinition in der Referenz Vorrang zu haben.Funktion und Variable mit dem gleichen Namen

  1. Kann die benannte Funktion ausgeführt werden oder ist sie vollständig durch die Variablendeklaration verdeckt?
  2. Ist es das Standardverhalten in Javascript, dass Variablen Vorrang vor Funktionen mit demselben Namen haben?

Sorry für die zweiteilige Frage, aber es schien verschwenderisch, zwei getrennte Fragen zu stellen.

Code:

<!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

Ich vermute, dass Javascript-Funktionen nach oben hievt, so dass die Variablendefinition auftreten, nachdem der Funktionsdefinition. Daher ist die letzte Definition - die Variable - die verwendete. –

Antwort

15

In JavaScript Funktionsdefinitionen werden an den oberen Rand des aktuellen Bereich gehoben. Ihr Beispielcode lautet daher wie:

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

Dieses einige gute Lektüre zu diesem Thema: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+2

Großer Artikel. Die Tatsache, dass Sie eine benannte Funktion mit einem beliebigen Wert überschreiben können, scheint wirklich problematisch zu sein, obwohl es einen Designvorteil geben muss. In dieser Frage ging ich davon aus, dass die Variable und die Funktion als zwei diskrete Elemente gehalten wurden, da kein Fehler ausgelöst wurde. –

+2

Auch nützlich: 1) http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname 2) http://javascriptweblog.wordpress.com/2010/07/06/function -declarations-vs-function-Ausdrücke / –

Verwandte Themen