fonctions auto-appelantes
-
03-07-2019 - |
Question
quand je code:
var a =
function()
{
alert("44")
return function(){alert(33)}
}()();
cette expression est-elle évaluée dans l'ordre suivant?
- définir la fonction;
- passe son pointeur de référence sur un
- a () est appelé
- retourne dans un nouveau pointeur de fonction
- a () est à nouveau appelé
et si oui, pourquoi ai-je une erreur de syntaxe si je le fais:
function()
{
alert("44")
return function(){alert(33)}
}();
l'interprète veut d'abord un opérande de gauche ...
mais cette syntaxe fonctionne:
(
function()
{
alert("44")
return function(){alert(33)}
};
)()
la parenthèse externe que signifie le sens ???
Merci
La solution
C'est la syntaxe du langage. Si vous souhaitez exécuter une fonction anonyme sur place, vous devez la placer entre parenthèses.
JS a ces cas extrêmes où la syntaxe est plus étrange que prévu. Prenons, par exemple, l’évaluation d’une chaîne contenant un JSON ne fonctionne que si elle est entourée de parenthèses.
// Wrong
eval("{ ... }");
// Right
eval("({ ... })");
C'est la syntaxe du langage.
Cela dit, je pense (et ceci est strictement à mon humble avis), les étapes que vous avez décrites ne sont pas précises.
- La fonction est définie et appelée. alerte (" 44 "); se produit à la suite.
- La fonction retourne une autre fonction qui est également appelée. alerte (" 33 "); se passe.
- La fonction la plus interne ne renvoie rien, donc a est indéfinie. typeof a renvoie "non défini".
Autres conseils
-
function () {alert ("44")) renvoie function () {alert (33)}}
vous définissez la fonction -
function () {alert (" 44 ") renvoie function () {alert (33)}}
()
vous appelez cette fonction en retournant une fonction anonymefunction () {alert (33)}
-
function () {alert (" 44 ") renvoie function () {alert (33)}} ()
()
vous appelez la fonction retournée, elle est donc équivalente àfunction () {alert (33)} ()
Donc toute l'exécution est équivalente à:
alert("44"); alert(33);
Je viens aussi d'apprendre des fonctions d'invocation automatique.
et je pense que le code devrait être
3. (function () {alert ("44")); renvoyer function () {alert (33);}}) () ()