簡體   English   中英

某些方法如何知道事先接受爭論?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM