2016-07-27 9 views
0

ich ein Array mit Funktionen haben: var ranArray = [funct1(), funct2()] und die Funktionen selbst:Wie die Ausführung von Funktionen zu stoppen, bis sie auf Javascript aufgerufen werden

function funct1() { 
    document.write("hello"); 
}; 
function funct2() { 
    document.write("hi"); 
}; 

Ich versuche, es zu machen, so dass, wenn eine Taste gedrückt wird, entweder funct1 oder funct2 wird ausgeführt. Aber ohne mich sogar den Knopf zu drücken, auf der Seite sehe ich meinen Knopf und "hallohi". Hier ist die Funktion für die Randomisierung:

function getFunctions() { 
    return ranArray[Math.floor(Math.random * ranArray.length)]; 
}; 

und hier ist die HTML:

<button type="button" name="ranButton" id="ranButton" onclick="getFunctions();">Random Button</button> 

Antwort

1

Ihre Array-Deklaration tatsächlich ruft funct1 und funct2 und zu versuchen, die Rückgabewerte im Array zu speichern. Was Sie wollen, ist eine Reihe von Funktionen. Entfernen Sie die Klammern, damit die Funktionen selbst im Array und nicht in den Rückgabewerten gespeichert werden. Es sollte wie folgt aussehen:

var ranArray = [funct1, funct2]; 
2

Zunächst müssen Sie die Funktionsreferenzen speichern ([funct1, funct2]), die () sofort die Funktionen aufrufen. Als nächstes können Sie .call() verwenden, um die Funktion aufzurufen, oder einfach () am Ende der ranArray[Math.floor(Math.random() * ranArray.length)] als @ jfriend00 genannten hinzufügen. Beachten Sie auch, dass Math.randomMath.random() sein muss.

var ranArray = [funct1, funct2]; 

    function funct1() { 
    document.write("hello"); 
    }; 
    function funct2() { 
    document.write("hi"); 
    }; 

    function getFunctions() { // Note you don't really need a 'return' here 
    return ranArray[Math.floor(Math.random() * ranArray.length)](); 
    }; 

Demo


Auch die Verwendung von document.write() hier wird das Überschreiben des DOM. Also ich empfehle es nicht, lieber möchten Sie diesen Inhalt in ein Element einfügen. Wenn Sie ein Element der ID #foo haben könnten Sie stattdessen den Text des DOM-Element gesetzt:

document.getElementById("foo").textContent = "..."; 

Demo 2

+0

Es gibt keinen Grund für '.call()' hier. Sie können einfach 'return ranArray [Math.floor (Math.random() * ranArray.length)]();' – jfriend00

+0

@ jfriend00 Wirklich? Ich hätte das nicht erwartet. Ich werde es bearbeiten, danke dafür. –

+0

Das Ergebnis der Indizierung in Ihr Array ist eine Funktionsreferenz. Wenn Sie also ein '()' am Ende hinzufügen, wird diese Funktionsreferenz aufgerufen. – jfriend00

Verwandte Themen