2017-03-11 3 views
0

Ich bin ein bisschen verwirrt durch die Tatsache, dass ich manchmal Funktionen auf bestimmte Arten verwenden kann, ohne tatsächlich zu erklären, dass ein Argument in ihm übergeben werden muss.Wie können bestimmte Methoden im Vorfeld argumentieren?

Hier sind einige Beispiele, ich weiß, dass sie unterschiedlich sind, wie sie interpretiert werden könnten, aber die allgemeine Theorie scheint mir ein bisschen seltsam.

Also normalerweise würden Sie das Argument mit der Deklaration von Variablen wie so passieren:

def usualexample(x): 
     print x; 
     return False; 


somevarname = usualexample(5); 
somevarname; 

die in diesem Fall 5 auszudrucken würde und das Rück Falsch. Aber in einigen Fällen wie in diesem Beispiel mit JavaScript kann ich die Funktion verwenden, ohne irgendein Argument zu übergeben, obwohl das Programm ein Ereignis als ein Argument in die Funktion übergibt, ohne dass der Programmierer es tatsächlich wie folgt sagt.

var innermost = document.getElementsByTagName("section"); 


for (var p = 0; p < innermost.length;p++){ 
    innermost[p].onclick = showinfo; 

} 




function showinfo(event){ 
    Do something with the event argument 
} 

Ein weiteres ähnliches Beispiel in Python mit dem pyhook Modul wäre:

import pyHook; 
def dosomething(event): 
    do something with the event argument. 
manager = pyHook.HookManager(); 
manager.KeyDown = dosomething; 

bei der innersten [p] .onclick und im Fall der manager.KeyDown Erklärungen, wie sie kennen Vorrücken, um die Funktion mit einem Argument zu versorgen?

Könnte jemand bitte die Logik dahinter erklären? Ich weiß, dass sie separate Deklarationen sind und einen völlig anderen Zweck erfüllen, aber ich muss nur wissen, wie diese Deklarationen im Voraus wissen, um die Funktion mit dem Argument zu versorgen, ohne sie im Voraus zu spezifizieren.

Antwort

1

Es gibt einen Unterschied zur Ausführung des Codes einer Funktion und zum Speichern eines Verweises auf die Funktion, ohne sie auszuführen. Wenn Sie die Funktion schreiben:

function showinfo(event){ 
    console.log('showinfo executed'); 
} 

wird nichts ausgeführt. Sie definieren nur, was die Funktion tun soll, wenn sie ausgeführt wird. Sie können es jetzt sofort mit Klammern aufrufen.

showinfo(3); 

Dadurch wird die Nachricht in der Konsole angezeigt. Sie können jedoch auch eine Referenz (ähnlich wie der Name) einer Methode übergeben. Also, wenn Sie schreiben:

var innermost = document.getElementsByTagName("section"); 
innermost[0].onclick = showinfo; 

Es passiert nichts, aber intern weiß der Browser die ‚show‘ Methode aufrufen, wenn ein Klick auftritt.Sie können dies auch in Ihrem eigenen Code:

var rememberedFunction; 
function rememberFunction(func) { 
    rememberedFunction = func; 
} 
function callFunction(value) { 
    if (rememberedFunction) { 
    rememberedFunction(value); // This calls the function you saved 
    } 
} 

rememberFunction(someinfo); // Nothing is output to the console 

// ... much later 
callFunction(3);   // The message is output to the console here 

Sie können dies vom Browser Ereignisse in allen möglichen Situationen um Hilfe bittet die Ausführung von Methoden zu schreiben Ajax-Aufrufe und Versprechungen zu handhaben.

1

Der Code war entworfen, um in einem Argument übergeben. Was immer Ereignisse in JS und pyHook behandelt, wird immer ein Ereignisobjekt an einen Handler übergeben. Daran ist nichts Magisches.

In JS ist es in Ordnung, wenn eine Funktion Argumente ignoriert. So ist die folgende Rechts:

function foo() { ... } 
foo('bar'); 

Dies ist nicht der Fall in Python jedoch; Wenn Sie eine Funktion zuweisen, die einem Hook 0 Argumente zuweist, wird eine Ausnahme ausgelöst.

Verwandte Themen