繁体   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