toutes font à peu près la même chose, avec quelques différences subtiles:
Il y a une distinction entre le nom de la fonction et la variable à laquelle la fonction est affectée. Le nom de la fonction ne peut pas être modifié, tandis que la variable à laquelle la fonction est affectée peut être réaffectée. Le nom de la fonction ne peut être utilisé que dans le corps de la fonction. Tenter de l’utiliser en dehors du corps de la fonction entraîne une erreur (ou undefined
si le nom de la fonction a été précédemment déclaré via une instruction var
)., Par exemple:
var y = function x() {};alert(x); // throws an error
le nom de La fonction s’affiche également lorsque la fonction est sérialisé par Function
‘s méthode toString.
d’autre part, la variable à laquelle la fonction est affectée n’est limitée que par sa portée, qui est garantie d’inclure la portée dans laquelle la fonction est déclarée.
comme le montre le 4ème exemple, le nom de la fonction peut être différent de la variable à laquelle la fonction est assignée. Ils n’ont pas de rapport les uns aux autres. Une déclaration de fonction crée également une variable avec le même nom que le nom de la fonction., Ainsi, contrairement à celles définies par des expressions de fonction, les fonctions définies par des déclarations de fonction sont accessibles par leur nom dans la portée dans laquelle elles ont été définies:
Une fonction définie par ‘new Function'
n’a pas de nom de fonction. Cependant, dans le moteur JavaScript SpiderMonkey, la forme sérialisée de la fonction s’affiche comme si elle portait le nom « anonymous ». Par exemple, la balise alert(new Function())
sorties:
function anonymous() {}
Car la fonction n’a pas de nom, anonymous
n’est pas une variable qui peut être consulté à l’intérieur de la fonction., Par exemple, ce qui suit entraînerait une erreur:
var foo = new Function("alert(anonymous);");foo();
Contrairement aux fonctions définies par des expressions de fonction ou par le constructeur Function
, une fonction définie par une déclaration de fonction peut être utilisée avant la déclaration de fonction elle-même. Par exemple:
foo(); // alerts FOO!function foo() { alert('FOO!');}
d’Une fonction définie par une expression de fonction ou par une déclaration de fonction hérite de la portée actuelle. Autrement dit, la fonction forme une fermeture., D’autre part, une fonction définie par un constructeur Function
n’hérite d’aucune portée autre que la portée globale (dont toutes les fonctions héritent).
Les fonctions définies par les expressions de fonction et les déclarations de fonction ne sont analysées qu’une seule fois, alors que celles définies par le constructeurFunction
ne le sont pas. Autrement dit, la chaîne de corps de fonction transmise au constructeur Function
doit être analysée à chaque appel du constructeur., Bien qu’une expression de fonction crée une fermeture à chaque fois, le corps de la fonction n’est pas réparé, donc les expressions de fonction sont toujours plus rapides que « new Function(...)
« . Par conséquent, le constructeur Function
doit généralement être évité dans la mesure du possible.
Il convient cependant de noter que les expressions de fonction et les déclarations de fonction imbriquées dans la fonction générée en analysant une chaîne deFunction constructor
ne sont pas analysées à plusieurs reprises. Par exemple:
Une déclaration de fonction est très facilement (et souvent involontairement) transformée en expression de fonction., Une déclaration de fonction cesse d’être un quand il, soit:
- devient une partie d’une expression
- n’est plus un « élément source » d’une fonction ou le script lui-même. Un « élément source » est une instruction Non imbriquée dans le script ou un corps de fonction: