En JavaScript, cela fait-il une différence si je l'appelle une fonction avec des parenthèses?
J'ai remarqué une différence lors de l'appel d'une fonction avec des parenthèses vides, ou sans parenthèses à tous. Cependant, je ne suis pas de passage d'arguments à la fonction, donc je me demandais, quelle serait la différence entre:
window.onload = initAll();
et
window.onload = initAll;
Veuillez expliquer le principe derrière elle.
- Le
()
caractères sont appelés des "parenthèses". "Crochets" fait référence aux[]
. J'ai édité ton post pour se conformer. - Bangs - Uniquement en anglais AMÉRICAIN; et pas ailleurs. Bien que les programmeurs ont tendance à les appeler "entre parenthèses" pour éviter la confusion, en anglais BRITANNIQUE, les arrondis sont connus simplement comme des crochets. Les carrés sont connus comme des "crochets". en.wikipedia.org/wiki/Bracket
- dans la programmation de la
()
sont certainement PAS entre parenthèses, n'avait jamais été indépendamment des paramètres régionaux du programmeur. Et pour être complet[]
sont des crochets et{}
sont croisillons. - lollipop - j'allais juste sur la langue commune, j'entends les développeurs à tous les niveaux de l'utiliser tous les jours et ont fait pendant des années. Si vous dites "supports" dans le royaume-UNI, tout le monde, les programmeurs semblables, vont penser de la parenthèse, pas de crochets. Si vous voulez dire "[]", vous auriez à dire à crochets. C'est juste la façon dont il est.
- sur une note plus sérieuse, l'officiel des noms de fichier UNICODE est une Parenthèse. 0028
(
PARENTHÈSE GAUCHE = ouverture de la parenthèse (1.0) et 0029)
PARENTHÈSE DROITE = parenthèse fermante (1.0) -- unicode.org/charts/charindex.html#P et ce Dictionary.com a à dire sur le sujet -- dictionary.reference.com/browse/PARENTHESIS "l'une ou les deux à la verticale des lignes courbes, ( ) ..." - Donc ce n'est pas seulement un "anglais US" chose, c'est une norme Internationale définition, car UNICODE est un Standard International.
- Où obtenez-vous vos faits d', sérieux?
{}
sont appelés les écureuils crochets. - Il est étonnant de voir ce post a obtenu 12+ haut de votes? initAll() est le résultat de la fonction intAll est la fonction elle-même. C'est le code JavaScript de base.
- lollipop - Unicode est une norme internationale sur l'encodage des caractères que des octets, et non pas sur l'appellation. Les auteurs du document unicode ne sont pas réclamer le nom donné à un personnage est une norme internationale. C'est le code vs le caractère de la définition. Mais, vous pouvez noter qu'il peut également référer à [ et ] que les crochets - (pas seulement les "crochets"), et qu'ils se réfèrent à tous [, { et ( comme le bracketing de caractères. Vous devez vous efforcer de comprendre les nuances dans la façon dont différents endroits utiliser les mêmes mots. Très important si vous faites partie d'une équipe internationale.
- crochets peut-être une classe autour de personnages comme votre lien vers l'article de wikipédia précise que () sont toujours de la parenthèse, prouver mon point de vue pour moi. Et de mon point de exactement est de la sémantique sont importants, dans la programmation, ils sont appelés paranethesis, pour lever l'ambiguïté sémantique de l'autre "entre parenthèses". Je suppose que vous vous référez à & comme un symbole et non une esperluette ainsi? Même ligne de raisonnement. Tous les IDE préférences reportez-vous à
()
comme parenthsis et[]
que des supports et{}
des accolades. Et l'officiel des noms de fichier UNICODE est parenthsis pour ces personnages et tous les autres "support" comme les courbes. - Donc, de mon point de vue vous devez vous référer à eux par l'onu-des noms ambigus, à l'échelle Internationale comme UNICODE ne et de tous les IDE ne. vertigrated.com/images/prefs.png
- D'accord - il est préférable de se référer à () comme des parenthèses pour éviter toute ambiguïté - j'ai dit que les programmeurs ont tendance à dans mon 1er commentaire. Cependant, il n'y a rien de plus ambigu que d'attendre que les gens à utiliser la langue d'une manière qui est en contradiction avec ce qu'ils sont utilisés pour. Si vous voulez dire "[]" dans le royaume-UNI, vous aurez à dire entre crochets. Et si quelqu'un dit "crochets", chacun assumera les ronds, pas des carrés. Il importe, pour des raisons de clarté, pas un iota de ce qu'une norme dit que si les gens ne le suivez pas. Je suis sûr que si vous regarder à travers tout le standard Unicode, vous pourrez apercevoir vos propres exemples de cette trop.
- Vous devez comprendre que la plupart des langues et des normes sont fortement biaisée vers l'anglais AMÉRICAIN. Le moment où vous NOUS quittez l'anglais comme langue première, les choses deviennent beaucoup plus ambiguë. Les choses qui sont morts établir des normes dans l'anglais des usa peut aller à l'encontre de la façon dont le reste du le monde anglophone a été enseigné, pour ne pas mentionner d'autres langues. Si vous voulez être clair et sans ambiguïté, puis utilisez la langue que de ne pas être mal compris par n'importe qui. Parenthèse - juste assez. Des crochets au lieu des crochets, l'oublier.
Vous devez vous connecter pour publier un commentaire.
Ce exécute
initAll()
tout de suite et affecte le fonction de la valeur de retour àwindow.onload
. C'est généralement pas ce que vous voulez.initAll()
aurait à retourner une fonction pour ce qui est logique.cela affecte le d'une fonction réelle à
window.onload
- c'est possible parce qu'en JavaScript, comme @Felix dit, les fonctions sont des objets de première classe - sans l'exécuter.initAll
sera exécutée par l'événement load.Ce Pekka dit est correct, mais je veux dire un peu avec un exemple qui vous permettra d'expliquer à quelqu'un qui ne veut pas comprendre pleinement les pointeurs de fonction ou de délégués.
Je ne les utilise pas
window.onload
parce que c'est un peu artificiel à démontrer. Je vais utiliser un simple multiplier la fonction de démonstration à la place:Il pourrait tout aussi bien être écrit:
Alors que dans le premier exemple, l'implication ne peut pas être évident, le second exemple montre plus clairement que nous sommes en affectant une fonction qui a 2 paramètres à une variable appelée
Multiply
, et ce concept de fonctions que des affectations est commun à l'ensemble de JavaScript. C'est une petite démonstration du fait que les fonctions sont "première classe des citoyens", c'est qu'ils peuvent être passés exactement comme si nous étions de passage autour de valeurs.Alors maintenant, à la différence de l'affectation:
Au point de la définition de la variable ret,
Multiply
est exécuté et la valeur de retour est assignée -ret
devient égal à 12.Essayons encore une fois de façon différente:
Maintenant, au point de définir
ret
,ret
devient votreMultiply
fonction plutôt que le résultat obtenu à partir de votreMultiply
fonction. Les appels àret()
sera la cause de votreMultiply
de la fonction à exécuter, et vous pouvez l'appeler exactement comme si vous aviez appeléMultiply(operator, operand)
:est le même que
Que vous avez dit que vous allez utiliser
ret
en tant que délégué pourMultiply()
. Lors de l'appel deret
, nous sommes vraiment se référant à laMultiply
fonction.Retour à votre
window.onload
. Pensez à ce que:Donc, comme vous pouvez le voir,
window.onload
est une fonction comme une autre fonction, il n'y a rien de spécial à ce sujet. Vous pouvez lui affecter une valeur, de lui attribuer une fonction, la valeur null si vous le désirez, le point est qu'il n'y a plus rien de spécial à propos dewindow.onload
qu'il y a sur votre propre fonction. La seule légèrement différent, c'est qu'il est appelé par la fenêtre quand il est chargé. [Disclaimer: je n'ai jamais réellement annulée par la fenêtre de fonctions, donc je ne suis pas sûr si cela va entraîner des répercussions négatives. On espère qu'ils vérifier pour voir si une fonction est attribuée avant de l'appeler c'est à direif (window.onload) window.onload();
].Appelle maintenant
initAll()
ce que nous disons, c'est:qui pourrait tout aussi bien dire:
Mais quand nous disons
initAll
sans les parenthèses, ce que nous sommes vraiment dire, c'est: je veux remplacer quelle que soit ma fenêtre.onload fonction est, avec une nouvelle fonction, c'est à dire que je veux le remplacer par moninitAll
fonction, de sorte que tous les appels àwindow.onload
va moninitAll
code.Donc:
est remplacé par:
Donc tout appel à
window.onload
exécutera votreinitAll
fonction de la place de ce quewindow.onload
était à l'origine. Vous avez remplacé la fonction d'origine avec votre nouvelle fonction.En fait, vous pourrait également écrire:
Un autre exemple qui peut démontrer le mieux, c'est ce:
Quel que soit le temps était à l'époque
d
est défini finit attribué àcurrentTime
. Grande, mais qui est seulement utile si nous voulons savoir à quelle heure la fonction contenant le code a été appelée à - dire au temps de chargement de page. Si nous voulons l'heure actuelle tout le temps quecurrentTime
est appelé?Notez comment nous appeler
b()
dans notrec
etd
affectations exactement comme l'on pourrait appelercurrentTime()
?Des fonctions en javascript sont des citoyens de première classe, et en tant que tel, peut être affecté à d'autres variables ou passés comme arguments.
Donc, quand vous ne
Vous définissez la
onload
propriété de lawindow
objet de référence de lainitAll
fonction elle-même.Lorsque vous ne
Vous définissez la
onload
propriété pour contenir la valeur de retour de initAll, depuis qu'il s'exécutera en place sur cette ligne.initAll
est une référence à une valeur de la fonction et les supports de l'opérateur ajouté le nom de la fonction s'EXÉCUTE cette fonction de l'objet.Donc, si vous faites quelque chose comme
puis
a
va devenir le même queinitAll
- par exemple, vous pouvez fairea()
- mais avecla variable
a
obtiendrez la valeur de retour de lainitAll
fonctionJe suis de 6 ans de retard mais j'ai l'impression que cela pourrait avoir été expliqué beaucoup plus simple que les réponses ci-dessus.
Voici donc la TLDR; ou vue à vol d'oiseau lors de l'appel de fonctions à l'aide et ne pas l'utiliser
()
'sPermet de prendre cette fonction, par exemple:
si vous vous connectez "foo" - sans
()
N'utilisant pas de
()
moyens de chercher de la fonction elle-même. Vous voulez faire cela si vous voulez qu'il soit transmis comme un rappel.si vous vous connectez "foo()" - avec
()
À l'aide de
()
après une fonction pour exécuter la fonction et retourner la valeur.