JavaScript:具有回调和参数的事件侦听器

JavaScript:具有回调和参数的事件侦听器,javascript,function,parameters,callback,event-listener,Javascript,Function,Parameters,Callback,Event Listener,我有一个事件处理程序,它(a)需要参数,(b)通过window.setTimeout调用回调函数。我使用bind来附加事件处理程序 被调用的函数是用附加参数调用的。我尝试了回调(参数)和`callback.call(这个,参数) 下面是一个代码示例: var element=document.querySelector('h1'); element.onclick=function(e) { delay(test.bind(element,'from original','also fr

我有一个事件处理程序,它(a)需要参数,(b)通过
window.setTimeout
调用回调函数。我使用
bind
来附加事件处理程序

被调用的函数是用附加参数调用的。我尝试了
回调(参数)
和`callback.call(这个,参数)

下面是一个代码示例:

var element=document.querySelector('h1');
element.onclick=function(e) {
    delay(test.bind(element,'from original','also from original',e));
}
function test(a,b,c,d,e) {
    alert(this);    //  element
    alert(a);       //  from original
    alert(b);       //  also from original
    alert(c);       //  event
    alert(d);       //  from delayed
    alert(e);       //  also from delayed
}
function delay(callback) {
    window.setTimeout(delayed,100);
    function delayed() {
        //  callback.call(this,'from delayed','also from delayed');
        callback('from delayed','also from delayed');
    }
}
在我的测试中,我发现回调按以下顺序获取参数:

  • 原始函数中的参数
  • 事件本身
  • 来自调用回调函数的参数
  • 此外,我发现回调函数已将
    this
    设置为原始元素,即使我使用
    .call
    this
    参数设置为任何值(甚至
    null

    我可以处理这种确定性,但我不清楚这是如何正式处理的。我在文档中找不到任何讨论带有回调的事件侦听器的内容

    问题是:

  • 参数的顺序记录在哪里
  • 这个
    来自哪里,为什么它似乎忽略了任何改变ie的尝试

  • 通过
    bind()
    ,您可以看到,谢谢您:

    bind()方法创建一个新函数,在调用该函数时,将其this关键字设置为提供的值,并在调用新函数时在任何提供的参数之前提供给定的参数序列

    所以这一行:
    test.bind(元素,'from original','alwayfrom original',e)

    将返回一个函数,该函数在调用时将首先使用提供的参数,然后再使用这些参数。因此,在调用函数时,它将按照上面列出的顺序进行操作



    至于
    this
    ,问题在于绑定后您正在使用
    setTimeout()
    ,这就是您可能无法获得预期效果的原因。您可以阅读更多关于
    setTimeout()
    的信息,您可以通过
    bind()
    看到:

    bind()方法创建一个新函数,在调用该函数时,将其this关键字设置为提供的值,并在调用新函数时在任何提供的参数之前提供给定的参数序列

    所以这一行:
    test.bind(元素,'from original','alwayfrom original',e)

    将返回一个函数,该函数在调用时将首先使用提供的参数,然后再使用这些参数。因此,在调用函数时,它将按照上面列出的顺序进行操作


    至于
    this
    ,问题在于绑定后您正在使用
    setTimeout()
    ,这就是您可能无法获得预期效果的原因。您可以阅读有关
    setTimeout()
    的更多信息