J'ai un morceau de code pour javascript que je ne comprends tout simplement pas:
function dmy(d) {
function pad2(n) {
return (n < 10) ? '0' + n : n;
}
return pad2(d.getUTCDate()) + '/' +
pad2(d.getUTCMonth() + 1) + '/' +
d.getUTCFullYear();
}
function outerFunc(base) {
var punc = "!";
//inner function
function returnString(ext) {
return base + ext + punc;
}
return returnString;
}
Comment définir une fonction dans une autre fonction? Pouvons-nous appeler pad2 () depuis l'extérieur de ma fonction ()?
Veuillez mettre un peu de lumière dessus. Merci
javascript
nested-function
Thomas
la source
la source
Réponses:
Les fonctions sont un autre type de variable en JavaScript (avec quelques nuances bien sûr). La création d'une fonction dans une autre fonction change la portée de la fonction de la même manière qu'elle changerait la portée d'une variable. Ceci est particulièrement important pour une utilisation avec des fermetures afin de réduire la pollution globale totale de l'espace de noms.
Les fonctions définies dans une autre fonction ne seront accessibles en dehors de la fonction que si elles ont été attachées à un objet accessible en dehors de la fonction:
Dans cet exemple, la fonction baz sera disponible pour une utilisation après l'
foo
exécution de la fonction, car elle est remplacéewindow.baz
. La fonction de barre ne sera disponible dans aucun contexte autre que les étendues contenues dans lafoo
fonction.comme exemple différent:
La
Fizz
fonction est conçue comme un constructeur afin que, lorsqu'elle est exécutée, elle affecte unebuzz
fonction à l'objet nouvellement créé.la source
C'est ce qu'on appelle la fermeture .
Fondamentalement, la fonction définie dans une autre fonction n'est accessible que dans cette fonction. Mais peut être passé en conséquence et ce résultat peut être appelé.
C'est une fonctionnalité très puissante. Vous pouvez voir plus d'explications ici:
javascript_closures_for_dummies.html miroir sur Archive.org
la source
est équivalent (ou très similaire) à
à moins que je ne me trompe.
Il ne se passe donc rien de drôle.
la source
L'instanciation de fonction est autorisée à l'intérieur et à l'extérieur des fonctions. À l'intérieur de ces fonctions, tout comme les variables, les fonctions imbriquées sont locales et ne peuvent donc pas être obtenues à partir de la portée extérieure.
foo
manipulebar
en lui-même.bar
ne peut pas être touché depuis la portée externe à moins qu'elle ne soit définie dans la portée externe.Donc, cela ne fonctionnera pas:
la source
Lorsque vous déclarez une fonction dans une fonction, les fonctions internes ne sont disponibles que dans la portée dans laquelle elles sont déclarées, ou dans votre cas, le
pad2
ne peut être appelé que dans ledmy
portée.Toutes les variables existantes dans
dmy
sont visibles danspad2
, mais cela ne se produit pas dans l'autre sens: Dla source
Il est parfaitement normal en Javascript (et dans de nombreux langages) d'avoir des fonctions à l'intérieur des fonctions.
Prenez le temps d'apprendre la langue, ne l'utilisez pas sous prétexte qu'elle ressemble à ce que vous savez déjà. Je suggérerais de regarder la série de présentations YUI de Douglas Crockford sur Javascript, avec un accent particulier sur l' acte III: Function the Ultimate (lien vers le téléchargement de la vidéo, les diapositives et la transcription)
la source
Jettera une erreur. Depuis
bar
est défini à l'intérieurfoo
,bar
ne sera accessible qu'à l'intérieurfoo
.Pour l'utiliser,
bar
vous devez l'exécuter à l'intérieurfoo
.la source