2010-09-21 27 views
0

Ma conjecture est que ce n'est pas possible, mais je voudrais f et f() de faire la même chose.Comment implémenter des parenthèses optionnelles pendant un appel de fonction? (surcharge de fonction)

var f = function(str){ console.log(str||'foo'); }(); 

    f;      // wanted output: 'foo' 
    f();     // wanted output: 'foo' 
    f('bar');    // wanted output: 'bar' 

Parce que f n'est plus une définition de fonction, il ne semble pas possible de faire f(), mais peut-être que je me manque quelque chose. Aucune suggestion?

Répondre

2

Non ce n'est pas possible. Les parenthèses sont nécessaires pour déterminer que la fonction doit être appelée.

La valeur de l'expression f() est le résultat de l'appel de la fonction, tandis que la valeur de f est la fonction elle-même (et f.tostring() si vous l'affichez).

+0

Exactement, et je voudrais le surcharger :) – vol7ron

+0

@ vol7ron: Cela ne fonctionnerait pas. Si 'f' était le même que' f() ', alors' f ('bar') 'serait le même que' f() ('bar') ', qui est le même que' f()() ('bar') ', qui est identique à' f()()() ('bar') '... et ainsi de suite, rendant impossible l'utilisation de paramètres dans un appel de fonction. – Guffa

+0

Oui, il semble que tout le monde veut décrire ce qui se passe - je comprends ce qui se passe, c'est pourquoi j'ai posé la question. Vraiment, je suis curieux de savoir si le langage a évolué et si cela est maintenant possible, comme Ruby, comme [Adam] (http://stackoverflow.com/users/226476/adam-crossland) a souligné. – vol7ron

1

Impossible. Les parenthèses sont la façon dont javascript sait que vous voulez que l'objet de la méthode soit exécuté.

+0

Oui, je voudrais juste rendre JavaScript plus clair lorsque j'utilise des mots d'action. Ex: 'Object.exec' - exec est un verbe au présent, donc je m'attends à ce que ce soit une fonction, donc'() 'serait simplement ajouté non-sens, mais des arguments optionnels pourraient être nécessaires' Object.exec (' en arrière-plan ') '. Je n'utilise pas les verbes comme variables à moins qu'ils soient au passé, ce qui permettrait de stocker des booléens. – vol7ron

+0

@ vol7ron: Je comprends ce que vous voulez faire, mais à moins que le langage ne supporte spécifiquement cette syntaxe - comme Ruby - vous n'avez pas de chance. Et dans le cas de JavaScript, vous n'avez pas de chance. –

+0

Ouais, on l'a probablement déjà demandé, je devrai utiliser seulement la fonction littérale, une autre variable, ou utiliser une variable globale au lieu de paramètres. – vol7ron

0

Enlever le () de votre déf.

var f = function(str){ console.log(str||'foo'); }; 

Sauf votre premier cas, tous fonctionneront. Vous devez spécifier () pour indiquer à javascript d'exécuter la fonction

+0

Tout le point de la question est d'avoir à la fois 'f' et' f() ', abandonner'() 'serait vaincre le but :( – vol7ron

+0

@ vol7ron lorsque vous avez'() 'dans votre définition de fonction signifie que vous êtes réellement l'exécuter et affecter le résultat qui dans ce cas est 'f' –

+0

' Parce que f n'est plus une définition de fonction, il ne semble pas possible de faire f() '- Je pensais que je l'avais déjà signalé – vol7ron