我有点困惑的是,我有时可以在某种程度上使用函数而不会实际声明必须在其中传递参数。
以下是一些例子,我知道它们在如何解释方面有所不同,但整体理论对我来说有点奇怪。
通常你会使用变量声明传递参数,如下所示:
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;
如果是最里面的[p] .onclick,并且在manager.KeyDown声明的情况下,他们如何事先知道为函数提供参数?
有人可以解释一下这背后的逻辑吗?我知道它们是单独的声明并填充完全不同的目的但我只需要知道这些声明如何事先知道为函数提供参数而不事先将它们实际指定给它们。
答案 0 :(得分:1)
代码设计以传递参数。无论处理JS和pyHook中的事件,总是将事件对象传递给处理程序。这没有什么神奇之处。
在JS中,函数可以忽略参数。所以以下是合法的:
function foo() { ... }
foo('bar');
然而,Python并非如此;如果你为一个钩子分配一个带0个参数的函数,它就会抛出异常。
答案 1 :(得分:1)
执行函数的代码并仅存储对函数的引用而不执行它是有区别的。编写函数时:
function showinfo(event){
console.log('showinfo executed');
}
什么都没有执行。您只需定义函数执行时应执行的操作。您现在可以使用括号立即调用它。
showinfo(3);
这将导致消息显示在控制台中。但是,您也可以传递方法的引用(有点像名称)。所以,如果你写:
var innermost = document.getElementsByTagName("section");
innermost[0].onclick = showinfo;
没有任何事情发生,但内部浏览器知道打电话给'showinfo&#39;发生单击时的方法。您也可以在自己的代码中执行此操作:
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的各种情况下执行方法。