Bonjour à tous,

Vous avez l'habitude de déclarer des fonctions... mais les connaissez-vous si bien que cela?

Certains les déclarent ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
function fct() {
	// ce que vous voulez...
}
D'autres, plus soucieux de ne polluer l'espace global feront plutôt ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
var fct = function () {
	// ce que vous voulez...
};
Mieux encore, afin de n'avoir qu'un seul bloc de déclaration par scope :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
var fct;
fct = function () {
	// ce que vous voulez...
};
Mais cela n'est pas encore suffisant !

En effet, imaginons que votre fonction soit un constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
var UnnamedConstructor;
UnnamedConstructor = function () {
	// ce que vous voulez...
};
console.log(new UnnamedConstructor()); // Object { }
Alors, oui, on a un objet mais, en console, il est impossible de savoir de quel constructeur provient cet objet, comme si on avait fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
var NamedConstructor;
function NamedConstructor() {
	// ce que vous voulez...
}
console.log(new NamedConstructor()); // NamedConstructor { }
La solution, pour avoir le même rendu, sans polluer l'espace global?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
var NamedConstructor;
NamedConstructor = function NamedConstructor() {
	// ce que vous voulez...
};
console.log(new NamedConstructor()); // NamedConstructor { }
Retenez bien, c'est le mot qui suit le mot-clé function qui nomme la fonction, pas la variable qui contient cette fonction.


Bien que l'usage de Function soit peu recommandé, de par son appel à eval(), il est parfois nécessaire de créer une fonction dynamique.

Alors, voici comment nommer une fonction dynamique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
var fct= (new Function(
	'var fct;'+
	'fct = function fct() {'+
	'	// ce que vous voulez...'+
	'};'+
	'return fct;'
))();