Déclaration de fonction en CoffeeScript
Je remarque que dans CoffeeScript, si je définir une fonction à l'aide de:
a = (c) -> c=1
Je ne peux faire le expression de fonction:
var a;
a = function(c) {
return c = 1;
};
Mais, personnellement, j'utilise souvent déclaration de fonction,par exemple:
function a(c) {
return c = 1;
}
J'utilise la première forme, mais je me demandais si il existe un moyen en CoffeeScript la génération d'une déclaration de fonction. Si il n'y a aucun moyen, je voudrais savoir pourquoi CoffeeScript éviter de le faire. Je ne pense pas que JSLint hurlaient d'une erreur de déclaration, tant que la fonction est déclarée dans le haut de la portée.
- Avez-vous une bonne raison de vouloir déclaration de fonction? Si votre utilisation de coffeescript vous ne devriez pas vous soucier du format de la compilation des JS, sauf si elle est cassée / buggé.
- Dans la plupart des cas, la déclaration de la fonction et de la fonction d'expression de la même façon, mais il y a une légère différence entre les deux. Par exemple, developer.mozilla.org/en/JavaScript/Reference/... Donc, dans certains cas, ils ne sont pas égaux.
- vous me lie à un morceau de code où la déclaration de la fonction est un comportement indéterminé. Voulez-vous utiliser les déclarations de fonction au lieu de les expressions de fonction de sorte que vous pouvez les abus de comportement indéterminé?
- Les déclarations de fonction peut être sympa pour la pile et d'autres traces de débogage, car un nom est associé à la fonction. C'est pourquoi CoffeeScript utilise pour
class
es. - c'est une autre question. C'est une des raisons que je n'utilise pas CS, le débogage compilé js est une douleur.
- Comment est-ce un autre problème? Vous avez envie d'une bonne raison pour la déclaration de la fonction.
function a(c)
vous donnant plus claire des traces de pile quea = function(c)
est une assez bonne raison. - Je voulais dire que c'est seulement une légère amélioration sur la difficulté de débogage compilé js. Ce que vous voulez vraiment est un débogueur peut lire coffeescript.
- Je n'ai pas remarqué de différences dans leurs traces de pile, mais il est bon de savoir.
- Même si le débogueur peut lire coffeescript, qui ne serait pas aider. Le Javascript qui CS est traduit pour ne pas avoir les fonctions nommées, par conséquent, le débogueur ne peut pas les afficher. En analysant le code source après le fait de comprendre quelles sont les variables de la fonction peut ou ne peut pas être affectée semble trop fragile pour moi.
Vous devez vous connecter pour publier un commentaire.
CoffeeScript utilise les déclarations de fonction (aka "les fonctions nommées") qu'à un seul endroit:
class
définitions. Par exemple,compile de
La raison CoffeeScript ne pas utiliser la fonction déclarations ailleurs, selon le FAQ:
En bref: à l'Aide de déclarations de fonction négligemment peut mener à des incohérences entre IE (pré-9) et d'autres JS environnements, de sorte CoffeeScript évite eux.
var a = function a() {};
). Les Déclarations de fonction (par exemple,function a() {}
) n'ont pas de tels croix-navigateur incohérencesOui, vous pouvez:
Vous échapper à la pure JS via le backtick `
Notez que vous ne pouvez pas le retrait de votre corps de la fonction.
Acclamations
function updateSettings() {
; ne -> dothings()}
pour permettre à l'indentation. github.com/jashkenas/coffeescript/issues/...Une chose à garder à l'esprit avec CoffeeScript est que vous pouvez toujours vous détendre au JavaScript. Alors que CoffeeScript ne supporte pas nommé les déclarations de fonction, vous pouvez toujours revenir à JavaScript pour le faire.
http://jsbin.com/iSUFazA/11/edit
Vous pouvez également écrire un big fat fonction en CoffeeScript puis il suffit d'utiliser les backticks astuce pour avoir JavaScript appel de la fonction:
Non, vous ne pouvez pas définir une fonction dans le café de script et de faire générer une déclaration de fonction dans le café script
Même si vous venez d'écrire
la JS généré sera enveloppé dans les parenthèses, ce qui en fait une expression de fonction
Je suppose que c'est parce que les déclarations de fonction get "hissé" en haut du cadre englobant qui permettrait de briser la logique de la coffeescript source.
Alors que c'est un vieux post, je voulais ajouter quelque chose à la conversation pour l'avenir Googlers.
OP est correct que nous ne pouvons pas déclarer des fonctions dans le plus pur CoffeeScript (à l'exclusion de l'idée de l'utilisation de l'arrière-tiques pour échapper à la pure JS à l'intérieur de la CoffeeScript fichier).
Mais ce que nous pouvons faire est de lier la fonction de la fenêtre, et essentiellement de la fin de quelque chose qu'on peut l'appeler comme si c'était un nom de fonction. Je ne suis pas à l'indiquer, est un nom de fonction, je suis en fournissant un moyen de faire ce que j'imagine de l'OP veut réellement faire (appel d'une fonction comme foo(param) quelque part dans le code) à l'aide de pure CoffeeScript.
Voici un exemple d'une fonction attachée à la fenêtre en coffeescript:
C'est à l'aide de Google Places à l'adresse de retour d'informations pour remplir automatiquement un formulaire.
Nous avons donc une partielle dans une application Rails, qui est chargé dans une page. Cela signifie que le DOM est déjà créé, et si nous appelons la fonction ci-dessus sur le chargement initial de la page (avant l'appel ajax rend l'partielle), jQuery ne verrez pas le $('#property_street_address_1') de l'élément (croyez-moi - il n'a pas).
Nous avons donc besoin de retarder la google.cartes.des lieux.La saisie semi-automatique() jusqu'à ce que l'élément est présent sur la page.
On peut le faire via l'Ajax de rappel sur le succès de la charge de la partielle:
Donc, ici, essentiellement, nous faisons la même chose que d'appeler foo()
Pourquoi? Parce que déclaration de fonction est le mal. Regardez ce code
Quel sera le résultat?
Si nous utilisons le définition de la fonction de
la sortie est:
Essayez ceci:
Maintenant le suivant affiche "true":
Je n'ai pas vraiment l'utiliser, mais ne souhaitent parfois café fonctions avaient des noms pour l'introspection.