某些方法如何知道提前进行争论?

How do certain methods know to take an argument in advance?

有时我可以以某些方式使用函数而没有实际声明必须在其中传递参数,这让我有点困惑。

这里有一些例子,我知道它们在解释方式上是不同的,但整体理论对我来说似乎有点奇怪。

所以通常你会像这样用变量声明传递参数:

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


somevarname = usualexample(5);
somevarname;

在这种情况下会打印出 5 和 return 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;

在最里面的[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

您可以这样做 post 在各种情况下执行方法,从浏览器事件到处理 ajax 调用和承诺。