Il s'agit d'un Fonction Expression 2
Expressions de fonctions peut ont également des noms ; les noms des expressions de fonction n'ont de portée que dans le corps de la fonction 1 . (Depuis que la 5e édition d'ECMAScript a déprécié l'option arguments.callee
c'est la seule façon simple d'écrire une fonction récursive "anonyme").
Parce qu'il est une expression de fonction, le nom ne peut pas 1 introduire une nouvelle liaison dans la portée extérieure.
En outre, tous sont des objets en JavaScript. Dans les f(..)
, f
est évaluée avant il est "invoqué" avec (..)
; si f
n'a pas été évaluée comme une fonction, une erreur est levée. C'est pourquoi les rappels, qui ne sont que des fonctions, peuvent être nommés par des variables et passés en tant que paramètres.
Vérifiez également l'hypothèse/l'affirmation concernant le prototype :
var abc = function def() {}
abc.prototype === abc // -> false
abc.name // -> "def"
1 Voir la réponse de Bergi.
2 Comment distinguer facilement les uns des autres ?
Les règles de grammaire sólo permettre function ..
d'être analysé comme une déclaration de fonction alors qu'il s'agit d'un Élément source bien que la plupart des moteurs continuent d'analyser [incorrectement] une déclaration de fonction en tant que Déclaration . Productions SourceElement sólo se produisent au niveau du "bloc" supérieur d'un programme ou du "bloc" supérieur d'une fonction.
En tout état de cause, chaque fois qu'il y a un function ..
qui apparaît dans un lieu qui exige un Expression , il volonté est analysé comme une expression de fonction. Les exemples qui sont tous analysées comme des expressions de fonction :
// Can only assign values: Statements do not have values!
var f = function () {}
var g = function gName () {} // see Bergi's answer
// Can only pass values: Statements do not have values!
doIt(function () {}) // callback / "anonymous function"
// IIFE: Immediately-Invoked Function Expression
;(function () {})() // standard IIFE
;(function () {} ()) // alternative standard IIFE
;+function () {} () // curious way to write an IIFE
// basically you can use any unary operator to turn it into an expression not only
// + but also - ! ~ and so on which will modify the return value accordingly
Le fait est qu'en tous un seul des cas susmentionnés, function ..
apparaît à un endroit de la grammaire exigeant une expression et est donc analysée comme une expression de fonction. (Les points-virgules au début des lignes ci-dessus évitent toute "ambiguïté" avec l'ASI, ce qui est nécessaire lorsque l'on écrit dans un style sans points-virgules, comme je le préfère).
Cependant. ;function () {} ()
y ;function f () {} ()
sont tous deux des syntaxes invalides - pourquoi ? ;-)