为什么在 jQuery 中调用函数需要包装在方法中?

2024-04-25

假设我有一个函数:

function myFunction() {
 ...
}

我想从事件处理程序中调用它。为什么这个结构不调用我的函数?

$(window).resize(myFunction());

但这确实有效:

$(window).resize(function(){myFunction()});

这些类型的呼叫有什么区别?


$(window).resize(myFunction());

立即地calls myFunction并通过返回值 to resize。在函数名称/引用后添加括号调用该函数。

另一方面,

$(window).resize(function(){myFunction()});

通过一个匿名函数 to resize. myFunction仅当调用外部函数时才被调用。

匿名函数没什么特别的。在这种情况下,它只是某种内联函数定义。您可以轻松地将其替换为函数引用:

var handler = function(){myFunction()}; // take out the function definition
$(window).resize(handler);  // and replace it with the new name

现在你可以看到函数名后面没有括号,这意味着,handler不被调用,仅传递引用。

我希望您现在也可以看到,在此示例中创建新函数是不必要的。您可以通过简单地传递引用来实现相同的目的myFunction:

$(window).resize(myFunction);

但这两种方式都有其用例。

第一个例子$(window).resize(myFunction());仍然有用,如果myFunction 返回一个函数应该用作事件处理程序:

function myFunction() {
    var handler = function() {};
    return handler;
}

也许返回的处理程序取决于传递给的参数myFunction.

如果要调用,则需要传递匿名函数myFunction有一些具体的论点:

function myFunction(a, b) {
    alert(a + b);
}

$(window).resize(function(){
    myFunction(40, 2);
});

Update:

@T.J。克劳德 https://stackoverflow.com/users/157247/t-j-crowder发表了重要评论event object http://api.jquery.com/category/events/event-object/。每个事件处理程序都会获取作为第一个参数传递的事件对象。如果您将函数定义为

function myFunction(event) {
 ...
}

要使用匿名函数(更容易)访问它,您必须通过以下方式传递它:

$(window).resize(function(event){myFunction(event)});

如果你想使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 jQuery 中调用函数需要包装在方法中? 的相关文章