Nous utilisons des instructions de retour en option dans les fonctions JavaScript. C'est un mot-clé. Mais quel est le type réel de return
lui - même. En fait, je suis devenu confus en voyant l'exemple:
function add(a, b) {
return (
console.log(a + b),
console.log(arguments)
);
}
add(2, 2);
Production:
4
[2, 2]
Ainsi, nous pouvons passer des expressions séparées par des virgules dans l' return
instruction. Est-ce une fonction?
Et en commençant par cela, pouvons-nous supposer que chaque mot-clé en JavaScript est finalement une fonction?
J'ai écrit un petit blog pour l'essentiel de cette discussion. Vous voudrez peut-être le vérifier ici .
javascript
return
keyword
Arnab Das
la source
la source
var a = (2 + 2)
.var a = (1, 2)
- cela aboutira àa
avoir la valeur en2
raison de la façon dont l'opérateur virgule fonctionne (oui, la virgule est un opérateur mathématique comme+
ou|
etc, en particulier, dans le calcul lambada, l'opérateur virgule implémente le combinateur K)Réponses:
Il n'a pas de type, ce n'est pas une valeur.
Tenter
typeof return;
vous donneraUnexpected token return
.Non, alors que les parenthèses peuvent être utilisées pour appeler une fonction, il s'agit ici d'un opérateur de regroupement contenant quelques expressions séparées par une virgule .
Une démonstration plus utile serait:
Quelles sorties
0
parce que le résultat dea + b
est ignoré (il est sur la LHS de l'opérateur virgule) eta - b
est retourné.la source
return
ne peuvent pas les voir, ce que vous demandiez.a + b
n'a simplement aucun effet visible car il n'a pas d'effets secondaires et la valeur est ignorée (enfin, étant donné qu'elle n'a aucun effet pratique, il est possible qu'un compilateur optimisant puisse la supprimer, mais cela ne fait aucune différence pratique).if
) est l'évaluation de court-circuit. L'opérateur virgule ne court-circuite pas, il évaluera donc les deux côtés. Ensuite, il retournera le dernier. C'est explicitement le but de l'opérateur virgule, de regrouper les expressions dans une seule instruction (généralement la valeur résultante de l'instruction entière est ignorée), le plus souvent utilisé pour l'initialisation des variables:var i = 2, j = 3, k = 4;
Je suis un peu choqué que personne ici n'ait directement référencé la spécification :
Donc, à cause de la spécification, votre exemple se lit comme suit:
return ( GetValue(exprRef) )
où
exprRef = console.log(a + b), console.log(arguments)
Qui selon la spécification sur l'opérateur virgule ...
... signifie que chaque expression sera évaluée jusqu'au dernier élément de la liste de virgules, qui devient l'expression d'affectation. Donc ton code
return (console.log(a + b) , console.log(arguments))
va1.) imprimer le résultat de
a + b
2.) Il ne reste plus rien à exécuter, alors exécutez l'expression suivante qui
3.) imprime le
arguments
, et parce queconsole.log()
ne spécifie pas une instruction de retour4.) Évalue à undefined
5.) Qui est ensuite renvoyé à l'appelant.
Donc la bonne réponse est,
return
n'a pas de type, elle ne renvoie que le résultat d'une expression.Pour la question suivante:
Non. La virgule en JavaScript est un opérateur, défini pour vous permettre de combiner plusieurs expressions en une seule ligne, et est défini par la spécification pour renvoyer l'expression évaluée de ce qui est en dernier dans votre liste.
Vous ne me croyez toujours pas?
Jouez avec ce code ici et dérangez la dernière valeur de la liste. Il renverra toujours la dernière valeur de la liste, dans votre cas, il se trouve que c'est
undefined.
Pour votre dernière question,
Encore une fois, non. Les fonctions ont une définition très spécifique dans la langue. Je ne la réimprimerai pas ici car cette réponse devient déjà extrêmement longue.
la source
Test de ce qui se passe lorsque vous renvoyez des valeurs entre parenthèses:
Donne la réponse
2
, de sorte qu'il semble qu'une liste de valeurs séparées par des virgules s'évalue jusqu'au dernier élément de la liste.Vraiment, les parenthèses ne sont pas pertinentes ici, elles regroupent des opérations au lieu de signifier un appel de fonction. Ce qui est peut-être surprenant, cependant, c'est que la virgule est légale ici. J'ai trouvé un article de blog intéressant sur la façon dont la virgule est traitée ici:
https://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/
la source
return ([1, 2])
devrait imprimer les deux valeurs?console.log((1, 2))
return
n'est pas une fonction. C'est la continuation de la fonction dans laquelle il se produit.Pensez à l'instruction
alert (2 * foo(bar));
oùfoo
est le nom d'une fonction. Lorsque vous l'évaluez, vous voyez que vous devez mettre de côté le reste de l'énoncé pendant un moment pour vous concentrer sur l'évaluationfoo(bar)
. Vous pouvez visualiser la partie que vous avez mise de côté comme quelque chose commealert (2 * _)
, avec un espace à remplir. Lorsque vous savez quelle est la valeur defoo(bar)
, vous la reprenez.La chose que vous avez mise de côté était la poursuite de l'appel
foo(bar)
.L'appel donne
return
une valeur à cette continuation.Lorsque vous évaluez une fonction à l' intérieur
foo
, le restefoo
attend que cette fonction se réduise à une valeur, puisfoo
reprend. Vous avez encore un objectif à évaluerfoo(bar)
, il est juste mis en pause.Lorsque vous évaluez à l'
return
intérieurfoo
, aucune partie defoo
n'attend une valeur.return
ne se réduit pas à une valeur à l'endroit à l'intérieurfoo
où vous l'avez utilisé. Au lieu de cela, cela entraîne la réduction de l' appel entierfoo(bar)
à une valeur et l'objectif "évaluerfoo(bar)
" est considéré comme complet et époustouflé.Les gens ne vous parlent généralement pas des suites lorsque vous êtes nouveau dans la programmation. Ils le considèrent comme un sujet avancé, simplement parce qu'il y a des choses très avancées que les gens finissent par faire avec des suites. Mais la vérité est que vous les utilisez tout le temps, chaque fois que vous appelez une fonction.
la source
alert(2 * _)
pour une utilisation ultérieure en Javascript (il existe une notation différente pour faire ce genre de chose).return
intérieurfoo
n'est pas une valeur; vous ne pouviez pas le regrouper dans une structure de données, l'assigner à une variable, attendre un moment, puis y ajouter quelque chose plus tard - et vous ne pouviez surtout pas le nourrir plus d'une fois. Mais, comme je l'ai dit, des sujets avancés.my_if
fonction qui se comporte comme une fonction intégréeif()then{}else{}
, et ne pas le faire même si vous vous autorisez à utiliser la fonction intégrée à l'intérieur - pas très avancée, et extrêmement instructive, surtout si vous allez finir dans le code qui transmet les rappels.le
return
voici un hareng rouge. La variante suivante est peut-être intéressante:qui sort comme dernière ligne
car la fonction ne renvoie réellement rien. (Il renverrait la valeur de retour du second
console.log
, s'il en avait une).Tel quel, le code est exactement identique à
la source
Un moyen intéressant de comprendre l' instruction return est d' utiliser l' opérateur void Jetez un œil à ce code
Puisque l'
return
instruction prend un argument qui est[[expression]]
et le retourne à l'appelant sur la pile, c'est-arguments.callee.caller
à- dire qu'il s'exécuteravoid(expression)
puis retournera,undefined
c'est l'évaluation de l'opérateur void.la source