【问题标题】:How do certain methods know to take an argument in advance?某些方法如何知道提前接受参数?
【发布时间】:2017-03-11 20:41:05
【问题描述】:

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

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

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

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;

在innermost[p].onclick 和manager.KeyDown 声明的情况下,他们如何提前知道为函数提供参数?

谁能解释一下这背后的逻辑?我知道它们是单独的声明并满足完全不同的目的,但我只需要知道这些声明是如何提前知道为函数提供参数的,而无需事先实际指定它。

【问题讨论】:

    标签: javascript python computer-science


    【解决方案1】:

    执行函数的代码和只存储对函数的引用而不执行它是有区别的。编写函数时:

    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
    

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

    【讨论】:

      【解决方案2】:

      代码设计是为了传递一个参数。无论在 JS 和 pyHook 中处理事件,都将始终将事件对象传递给处理程序。这并没有什么神奇之处。

      在 JS 中,函数可以忽略参数。所以以下是合法的:

      function foo() { ... }
      foo('bar');
      

      然而,在 Python 中情况并非如此;如果你将一个接受 0 个参数的函数分配给一个钩子,它会抛出一个异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2014-07-27
        相关资源
        最近更新 更多