什么's作为匿名函数的默认事件处理程序与函数名称之间的区别

What's the difference between default event handler as an anonymous function vs function name

本文关键字:函数 程序 事件处理 区别 之间 默认 什么      更新时间:2023-09-26

我正在修改一个版本的fancybox,以便在运行函数之前先执行一些代码。我想我可以把代码放在run函数中,但我想知道为什么我可以做以下操作我关心的原始行:

D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);

我想做以下事情:

    D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', function(){ /*do something */ run(); });

不幸的是,当我尝试像这样运行run函数时,我遇到了一个无法加载的错误。在这里使用默认处理程序和使用函数调用有什么区别?我知道它将被用作以前意义上的回调,但这里不应该是一样的吗?或者是否有一些默认参数被传递到后台运行中。我试着通过这个,也就是说,运行(这个),但fancybox仍然失败了。有什么想法吗?

较大的原始来源:

// jQuery plugin initialization
     $.fn.fancybox = function (options) {
        var opts = options || {},
            selector = this.selector || '';
    function run() {

        var group = [], relType = false, relVal = $(this).data('fancybox-group');
        // Check if element has 'data-fancybox-group' attribute, if not - use 'rel'
        if (typeof relVal !== 'undefined') {
            relType = relVal ? 'data-fancybox-group' : false;
        } else if (this.rel && this.rel !== '' && this.rel !== 'nofollow') {
            relVal = this.rel;
            relType = 'rel';
        }
        if (relType) {
            group = selector.length ? $(selector).filter('[' + relType + '="' + relVal + '"]') : $('[' + relType + '="' + relVal + '"]');
        }

        if (group.length) {
            opts.index = group.index(this);
            F.open(group.get(), opts);
        } else {
            F.open(this, opts);
        }
        return false;

    }
    if (selector) {
        D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);
    } else {
        $(this).unbind('click.fb-start').bind('click.fb-start', run);
    }
    return this;
};

试试这个:

    D.undelegate(selector, 'touchstart.fb-start click.fb-start')
      .delegate(selector, 'touchstart.fb-start click.fb-start', 
        function(){
          /*do something */ 
          run.call(this); 
        });

您必须确保"run"函数的this设置为预期的编写方式。换句话说,库确保调用的函数的this设置为相关的对象(fancybox对象或其他对象)。当您插入这样的匿名函数时,您的函数也会被这样调用。您需要将this的值传递给已经存在的函数。