2017-12-16 3 views
-5

Also habe ich ein gutes Verständnis der meisten statischen typisierten Sprachen vor allem C und C++. Aber als ich in Javascript ging, bemerkte ich etwas, das mich aus der Fassung brachte.Warum funktionieren JavaScript-Funktionen so?

Ich habe gelernt, diese Funktion zu schreiben, mit inneren HTML zu interagieren:

document.getElementById("SomeHTML").onclick = function(){ 



    document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>"; 

} 

Das ist alles schön und gut, aber es ist ein Problem. Wie soll ich das wieder verwenden soll und es lesbar zu halten ... kommt aus einem C++, wurde ich immer gelehrt Code auf diese Weise zu schreiben:

function MyFunc() 
{ 
      document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>"; 
} 

document.getElementById("SomeHTML").onclick = MyFunc(); 

Dieser Code sauberer zu sein (zumindest für mich) und Ich kann die Funktion wiederverwenden, aber es funktioniert nicht ... Ich kann diesen Weg in jeder Programmiersprache schreiben, aber in Javascript erzeugt es einen Fehler. Ich weiß nicht, was ich vermisse, ich weiß, es ist etwas Einfaches. Kann mir bitte jemand helfen, zu verstehen, warum ich auf diese Weise JavaScript-Funktionen nicht schreiben kann? Oder wenn ich mir bitte sagen kann, wie, weil ich letzteres viel lieber als das erstere bevorzuge. Danke im Voraus.

+3

Der letzte Code wird in JavaScript auch funktionieren –

+1

'.onclick = MyFunc()' ist das Ergebnis der 'MyFunc();' zuweisen. Verwenden Sie '.onclick = MyFunc;' stattdessen. Sie können auch den TypeScript-Playground ausprobieren, um den Fehler https://www.typescriptlang.org/play/index.html#src=function%20MyFunc()%0D%0A%7B%0D%0A%20%20%20 zu sehen % 20% 20% 20% 20% 20% 20% 20% 20document.getElementById (% 22AndereHTML% 22) .innerHTML% 20% 3D% 20% 22% 3Cp% 3E% 20Joe% 20has% 20a% 20cat% 20% 3C % 2Fp% 3E% 22% 3B% 0D% 0A% 7D% 0D% 0A% 0D% 0Adocument.getElementById (% 22SomeHTML% 22) .onclick% 20% 3D% 20MyFunc()% 3B – Slai

+0

@Slai hat recht und ironisch Der von Ihnen vorgeschlagene Code würde auch in C++ nicht funktionieren. Sie müssen die Funktion dem Handler zuweisen, nicht das Ergebnis seiner Ausführung (oder Sie müssen eine Funktion als eine Rückkehr Ihrer Bewertung zurückgeben) – Eineki

Antwort

2

Sie haben Glück! Der letztere Code wird auch in JavaScript funktionieren.

Im Folgenden habe ich drei verschiedene Möglichkeiten beschrieben, wie Sie dies mit einer vertrauteren Syntax erreichen können.

// The function to call 
 
function MyFunc(){ 
 
    alert('Working!'); 
 
} 
 

 
// Option 1 (Link 1) 
 
document.getElementById("one").addEventListener("click", MyFunc); 
 

 
// Option 2 (Link 2) 
 
document.getElementById("two").onclick = MyFunc;
<a href="#" id="one">Link 1</a><br> 
 
<a href="#" id="two">Link 2</a><br> 
 
<a href="#" id="three" onclick="MyFunc()">Link 3</a>

+0

Das ist eine sehr seltsame Art, es zu schreiben, aber krank nehme, was ich als es bekommen kann funktioniert und ich kann die Funktion wiederherstellen. Danke vielmals! – chree

+1

@chree Unsere Neugier, was denkst du ist daran so komisch? Die Syntax 'func()' mit '()' am Ende gibt normalerweise einen Funktionsaufruf an. Dies gilt auch für statisch typisierte Sprachen. Auf der anderen Seite gibt 'foo = bar', ohne Klammern, normalerweise eine Zuweisung an. – OptimusCrime

+0

ist, weil es innerhalb einer anderen Funktion ist, anstatt die Funktion selbst zu sein – chree

0

ist Ihre Funktion nicht ganz wiederverwendbar, mir würde ich

// Original version 
function MyFunc() { 
    document.getElementById("AnotherHTML").innerHTML = "<p> Joe has a cat </p>"; 
} 

document.getElementById("SomeHTML").onclick = MyFunc(); 

// Function Generator 
function MyFunc_generator(element, html_content) { 
    return function() { 
     element.innerHTML = html_content; 
    } 
} 

myfunc = MyFunc_generator( 
    document.getElementById("AnotherHTML"), 
    "<p> Joe has a cat </p>" 
} 

document.getElementById("SomeHTML").addEventListener("click", myfunc); 

einen anderen Ansatz verwendet haben, in den Code ganz einige Unterschiede gibt es. Wir können mit dem Vergleich der ursprünglichen MyFunc Funktion und der MyFunc_generator eins beginnen.

Die erste keine Rückgaberechnung hat, und so die Zuordnung document.getElementById("SomeHTML").onclick = MyFunc(); würde den Wert der undefined die onclik Handler des HTML-Elements, deren ID „SomeHTML“ zuweisen.

Die Funktion "MyFunc_generator" ist eine Higher order function, eine Funktion, die eine Funktion als Ergebnis seiner Auswertung zurückgibt.

Die Ausführung der Generatorfunktion hat zur Folge, dass eine spezialisierte Funktion mit reellen Werten anstelle von generischen erstellt wird.

Die Zuweisung im Beispiel würde eine Funktion (anonym) erstellen und diesem den Namen myfunc zuweisen. Diese Funktion entspricht Ihrer.

Sie können die Parameter des Generators ändern, um ähnliche Funktionen mit unterschiedlichen Zielen und/oder unterschiedlichen Inhalten zu erstellen.

Offensichtlich ist der Aufwand in solch einem einfachen Fall nicht das Ergebnis wert, aber wenn die Strategie, die Sie beschreiben müssen, ziemlich komplex ist, wird der Nutzen zunehmen.

Eine letzte Anmerkung. Die Zuordnung der Handler-Funktion zum Ereignis ist unterschiedlich.In Javascript ist der bevorzugte Weg mit addEventListener

Verwandte Themen