JavaScript Zwei Anfängerfragen zu JavaScript

Peter P.

Cadet 3rd Year
Registriert
Mai 2017
Beiträge
32
Hallo,

ich arbeite gerade das Buch Nick Morgan, JavaScript, durch. Dabei sind bei mir zwei Fragen aufgekommen die mir das Buch nicht beantworten konnte.

1. Funktionen ohne Parameter.

In einem Code Beispiel wird eine Überschrift mit JQuery bewegt, wenn der User diese anklickt.

Code:
function changeAbstand() {
    $("h1").offset({left :linkerAbstand, top : obererAbstand});
    linkerAbstand += 2;
    obererAbstand++;
    if (linkerAbstand > 200){
        linkerAbstand = 0;
    }
}

spontan hätte ich diie Aufrufende Funktion wiefolgt programmiert:

Code:
$("h1").click(changeAbstand());

hat jedoch nicht funktionert, in der Lösung sieht der aufruf wiefolgt aus:

Code:
$("h1").click(changeAbstand);

Frage: Muss ich Methoden die keine Parameter entgegen nehmen ohne die Rundenklammern aufrufen????


2. Funktionskörper kann auf äußere Variablen zugreifen?

Dieser Code-Ausschnitt stammt aus dem Hang-Man Spiel. Und ist die vorgeschlagene Lösung.

Code:
<script>
    var pickWord = function () {
        var words = [
            "javascript",
            "monkey",
            "amazing",
            "pancake"
        ];

        return words[Math.floor(Math.random() * words.length)];
    };

    var setupAnswerArray = function (word) {
        var answerArray = [];
        for (var i = 0; i < word.length; i++) {
            answerArray[i] = "_";
        }

        return answerArray;
    };

    var showPlayerProgress = function (answerArray) {
        alert(answerArray.join(" "));
    };

    var getGuess = function () {
        return prompt("Guess a letter, or click Cancel to stop playing.");
    };

    var updateGameState = function (guess, word, answerArray) {
        var appearances = 0;
        for (var j = 0; j < word.length; j++) {
            if (word[j] === guess) {
                answerArray[j] = guess;
                appearances++;
            }
        }

        return appearances;
    };

    var showAnswerAndCongratulatePlayer = function (answerArray) {
        showPlayerProgress(answerArray);
        alert("Good job! The answer was " + answerArray.join(""));
    };

    var word = pickWord();
    var answerArray = setupAnswerArray(word);
    var remainingLetters = word.length;

    while (remainingLetters > 0) { showPlayerProgress(answerArray); var guess = getGuess();
        if (guess === null) {
            break;
        } else if (guess.length !== 1) {
            alert("Please enter a single letter.");
        } else {
            var correctGuesses = updateGameState(guess, word, answerArray);
            remainingLetters -= correctGuesses;
        }
    }

    showAnswerAndCongratulatePlayer(answerArray);
</script>

Konkkret geht es um die Methode updateGameState = function (guess, word, answerArray) Zeile 30 -40. Mir ist unklar wieso der Parameter answerArray mit in die Methode gegeben wird, aber nicht zurückgegeben?

Wenn ich den Parameter verändern kann ohne ihn zurück zugeben. Wieso geb ich ihn dann überhaupt in die Methode?

Und warum klappt da ohne this aufzurufen mit this.answerArray hätte ich es ein klein wenig nachvollziehen können.

Viele Grüße

Peter P.
 
1: Der Name ist die Referenz zu der Funktion. Die Klammern zeigen, dass die Funktion ausgeführt / aufgerufen werden soll.

D.h., IMMER, wenn du die Klammern hinschreibst, wird die Funktion aufgerufen. Egal, ob mit oder ohne Parameter.
 
Peter P. schrieb:
Frage: Muss ich Methoden die keine Parameter entgegen nehmen ohne die Rundenklammern aufrufen????
Entscheid dich: Mit dem Einen (mit Klammern) rufst du die Funktion auf, mit dem Anderen (ohne Klammern) übergibst du die Funktion, welche dann darin aufgerufen wird. Sowas nennt man Callback. Ist die Basis überhaupt für Asynchronizität.

Kleines Beispiel:
Code:
var wait = var wait = function() { console.log( "Es wurde gewartet." ); };

setTimeout( wait, 3000 );
Hierbei übergibst du der Funktion setTimeout den Callback wait. Diese Funktion wird aufgerufen, wenn drei Sekunden verstrichen sind. Rufst du es nun per
Code:
setTimeout( wait(), 3000 );
auf, wird wait() ausgeführt, die Ausgabe findet statt, danach wird die Rückgabe (welche undefined ist) an setTimeout übergeben und nichts passiert, denn undefined kann nichts machen und außerdem wird ein Callback erwartet.
Peter P. schrieb:
Konkkret geht es um die Methode updateGameState = function (guess, word, answerArray) Zeile 30 -40. Mir ist unklar wieso der Parameter answerArray mit in die Methode gegeben wird, aber nicht zurückgegeben?

Wenn ich den Parameter verändern kann ohne ihn zurück zugeben. Wieso geb ich ihn dann überhaupt in die Methode?
JavaScript arbeitet mit Call by Value, außer es handelt sich um Objekte. Arrays sind ebenso Objekte (siehe typeof []), also werden diese ebenso by Reference übergeben. Heißt du brauchst also auch nicht irgendwas zurückgeben, weil die Referenz (= das eigentliche Objekt) bereits übergeben wurde und modifiziert werden kann.
Peter P. schrieb:
Und warum klappt da ohne this aufzurufen mit this.answerArray hätte ich es ein klein wenig nachvollziehen können.
Du baust keine Klasse und this wird nicht explizit gebunden, ergo kommst du mit this.irgendwas nicht weit.
 
Zurück
Oben