[英]How do certain methods know to take an argument in advance?
我有時會以某種方式使用函數而無需實際聲明必須在其中傳遞參數,這使我有些困惑。
這里有一些例子,我知道它們在解釋方式上有所不同,但是總體理論對我來說有點奇怪。
因此,通常情況下,您將通過變量聲明傳遞參數,如下所示:
def usualexample(x):
print x;
return False;
somevarname = usualexample(5);
somevarname;
在這種情況下將打印出5並返回False。 但是在某些情況下,例如在本例中使用JavaScript的情況下,我可以使用該函數而無需傳遞任何參數,即使程序知道在沒有程序員實際告訴它的情況下,將事件作為參數傳遞給函數也是如此。
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
}
Python中帶有pyhook模塊的另一個類似示例是:
import pyHook;
def dosomething(event):
do something with the event argument.
manager = pyHook.HookManager();
manager.KeyDown = dosomething;
對於internalmost [p] .onclick和manager.KeyDown聲明,他們如何事先知道為函數提供參數?
誰能解釋這個背后的邏輯嗎? 我知道它們是單獨的聲明,並且具有完全不同的用途,但是我只需要知道這些聲明是如何事先知道的,即可向函數提供參數,而無需事先實際向其指定。
該代碼旨在傳遞參數。 不管在JS和pyHook中處理事件的內容如何, 總是會將事件對象傳遞給處理程序。 這沒有什么神奇的。
在JS中,函數可以忽略參數。 因此,以下內容是合法的:
function foo() { ... }
foo('bar');
但是,在Python中並非如此。 如果您為鈎子分配一個接受0參數的函數,它將拋出異常。
執行函數的代碼和僅存儲對函數的引用而不執行函數是有區別的。 編寫函數時:
function showinfo(event){
console.log('showinfo executed');
}
什么都不會執行。 您只需定義函數在執行時應該做什么。 現在,您可以使用括號立即調用它。
showinfo(3);
這將導致該消息顯示在控制台中。 但是,您也可以傳遞方法的引用(類似名稱)。 因此,如果您寫:
var innermost = document.getElementsByTagName("section");
innermost[0].onclick = showinfo;
沒有任何反應,但是在內部,瀏覽器知道單擊時會調用“ showinfo”方法。 您也可以在自己的代碼中執行此操作:
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
您可以執行此操作以推遲從瀏覽器事件到處理Ajax調用和Promise的各種情況下方法的執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.