doen ongeveer hetzelfde, met een paar subtiele verschillen:
Er is een onderscheid tussen de functienaam en de variabele waaraan de functie is toegewezen. De functienaam kan niet worden gewijzigd, terwijl de variabele waaraan de functie is toegewezen, opnieuw kan worden toegewezen. De functienaam kan alleen binnen het lichaam van de functie worden gebruikt. Een poging om het te gebruiken buiten het lichaam van de functie resulteert in een fout (of undefined
als de functienaam eerder werd gedeclareerd via een var
statement)., Bijvoorbeeld:
var y = function x() {};alert(x); // throws an error
de functienaam verschijnt ook als de functie wordt geserialiseerd via Function
’s toString methode.
aan de andere kant wordt de variabele waaraan de functie wordt toegewezen alleen beperkt door zijn scope, die gegarandeerd de scope omvat waarin de functie wordt gedeclareerd.
zoals het vierde voorbeeld laat zien, kan de functienaam verschillen van de variabele waaraan de functie is toegewezen. Ze hebben geen relatie met elkaar. Een functie declaratie creëert ook een variabele met dezelfde naam als de functienaam., In tegenstelling tot de functies die worden gedefinieerd door functie-expressies, kunnen functies die worden gedefinieerd door functie-declaraties worden benaderd met hun naam in het bereik dat ze zijn gedefinieerd in:
een functie die wordt gedefinieerd door ‘new Function'
heeft geen functienaam. Echter, in de SpiderMonkey JavaScript engine, de serialized vorm van de functie toont alsof het de naam “anoniem”. Bijvoorbeeld, alert(new Function())
uitgangen:
function anonymous() {}
aangezien de functie eigenlijk geen naam heeft, is anonymous
geen variabele die binnen de functie kan worden benaderd., Bijvoorbeeld, het volgende zou resulteren in een fout:
var foo = new Function("alert(anonymous);");foo();
In tegenstelling tot functies gedefinieerd door functie-expressies of door de Function
constructor, kan een functie gedefinieerd door een functie-declaratie worden gebruikt voor de functie-declaratie zelf. Bijvoorbeeld:
foo(); // alerts FOO!function foo() { alert('FOO!');}
een functie gedefinieerd door een functieuitdrukking of door een functie declaratie erft de huidige scope. Dat wil zeggen, de functie vormt een afsluiting., Aan de andere kant erft een functie gedefinieerd door een Function
constructor geen andere scope dan de Globale scope (die alle functies erven).
functies gedefinieerd door functie-expressies en functie-declaraties worden slechts eenmaal ontleed, terwijl de functies gedefinieerd door de Function
constructor dat niet zijn. Dat wil zeggen, de functie body string doorgegeven aan de Function
constructor moet worden ontleed elke keer dat de constructor wordt aangeroepen., Hoewel een functieuitdrukking elke keer een afsluiting creëert, wordt het functielichaam niet hersteld, zodat functie-expressies nog steeds sneller zijn dan “new Function(...)
“. Daarom moet de Function
constructor in het algemeen zoveel mogelijk worden vermeden.
Er moet echter worden opgemerkt dat functie-expressies en functie-declaraties genest in de functie die wordt gegenereerd door het ontleden van een Function constructor
’s string niet herhaaldelijk worden ontleed. Bijvoorbeeld:
een functie declaratie wordt heel gemakkelijk (en vaak onbedoeld) omgezet in een functie expressie., Een functie declaratie houdt op er een te zijn als het ofwel:
- deel wordt van een expressie
- is niet langer een “bronelement” van een functie of het script zelf. Een “bronelement” is een niet-geneste statement in het script of een functie body: