Skip to content

Instantly share code, notes, and snippets.

@davidbauer
Created October 8, 2012 17:53
Show Gist options
  • Save davidbauer/3853898 to your computer and use it in GitHub Desktop.
Save davidbauer/3853898 to your computer and use it in GitHub Desktop.
Word counter V2
function countWords() {
var wordcount = 0;
var text = document.wordcounter.allthosewords.value;
var words = text.match(/\w+\W*/g);
if (words) {
wordcount = words.length;
}
}
function tellCount() {
countWords();
if (wordcount === 0) {
results.innerHTML = "Hey, champion. Can't you count to zero by yourself? How about pasting some real text."
} else if (0 < wordcount && wordcount < 500) {
results.innerHTML = "Your text consists of <i>" + text.length + " characters</i> and <i>" + wordcount + " words</i>. Sorry, not impressed. <br/><br/> <img src='http://media.tumblr.com/tumblr_m8tmyoMNZA1ruser4.jpg'>";
} else {
results.innerHTML = "Your text consists of <i>" + text.length + " characters</i> and <i>" + wordcount + " words</i>. Which is pretty fucking impressive.";
}
}
@hannesgassert
Copy link

Viel besser. Das Problem hier: wordcount ist nur innerhalb der Funktion countWords() definiert und gültig - innerhalb von tellCount() ist wordcount bloss undefined.

Theorieexkurs:
a) Jede Funktion stellt einen Geltungsbereich (scope) her, zusätzlich zum globalen Geltungsbereich in dem alles immer drin ist. Geltungsbereiche kann man auch verschachteln, durch Funktionen innerhalb von Funktionen. Funktionen haben immer auf den eigenen Geltungsbereich und auf alle "darüber" Zugriff.

b) Jede Funktion macht drei Sachen: Argumente entgegennehmen, etwas damit übernehmen, und dann wieder was zurückgeben.

Das gibt uns nun folgende Möglichkeiten:

  1. Wir definieren wordcount und length ausserhalb der beiden Funktionen, im globalen Geltungsbereich - und greifen einfach auf sie zu. Siehe Theorieexkurs a), da weisst du ja Bescheid eigentlich, gell.

  2. Wir nutzen das Wissen aus Theorieexkurs b) und schreiben eine Funktion, die einen Text entgegennimmt, die Berechnungen vornimmt und die Resultate zur Weiterverarbeitung zurückgibt.

Ich wär für 2), vor allem weil man mit den Geltungsbereichen immer grausam aufpassen muss, das ist immer eine fiese Fehlerquelle.

Das würde dann ungefähr so aussehen:

function countWords(text) {
     result = {};
     result.length = ....
     result.wordCount = ...
     return result;
}

function tellCount(result) {
     if(result.wordCount ...) // usw
}

tellCount(countWords(document.wordcounter.allthosewords.value));

/* // das gleiche wie
var counts = countWords(document.wordcounter.allthosewords.value);
tellCount(counts); */

Das ist alles nicht getester Code oder so, offensichtlich, but you know what I mean.

@davidbauer
Copy link
Author

Danke zum Zweiten. Wird beim nächsten Update berücksichtigt :-) Bis dahin ist eine voll funktionsfähige Version hier zu finden: http://labs.davidbauer.ch/wordcounter/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment