Jquery 为非匿名函数绑定此关键字

Jquery 为非匿名函数绑定此关键字,jquery,events,bind,Jquery,Events,Bind,假设我有以下代码 $("p").bind("click", function(){ alert( $(this).text() ); }); 当用户单击一个时,会显示一个警报。这里的好处是,我使用了“this”关键字 现在我想去掉匿名函数(每个脚本多次使用) 这现在指的是窗口。我该怎么做才能解决这个问题 更新: 回答者提出的实际可行的解决方案 $(function(){ $("p").bind("click", function() { myfunction($(this));})

假设我有以下代码

$("p").bind("click", function(){
  alert( $(this).text() );
});
当用户单击一个
时,会显示一个警报。这里的好处是,我使用了“this”关键字

现在我想去掉匿名函数(每个脚本多次使用)

这现在指的是窗口。我该怎么做才能解决这个问题

更新:

回答者提出的实际可行的解决方案

$(function(){
    $("p").bind("click", function() { myfunction($(this));});

    function myfunction(elem)
    {
      alert( elem.text() );
    }
});
这很好,但是每次调用这行代码时,您都将完成创建一个新函数,不是吗

$(function(){
    $("p").bind("click", function() { myfunction($(this));});

    function myfunction(elem)
    {
      alert( elem.text() );
    }
});

这里也没有删除匿名函数。但是您可以在其中调用另一个函数。

您希望将原始的“this”(上下文)传递给该函数

在Javascript中,这是通过调用来完成的。例如,见

所以我修改了乔纳森的答案:

$("p").bind("click", function(){ myFunction.call(this); });

function myfunction(){
  alert($(this).text());
}
增加:

我查看了jquery绑定,Jonathon是对的,上下文自动设置为您要将事件侦听器添加到的原始元素

我认为真正的问题是没有正确地传递函数ref

试一试


我在想,你为什么要这样做

$("p").bind("click", function(){
  alert( $(this).text() );
});
当您可以像这样添加更多选择器时:

$("p,div,li,:button").bind("click", function(){
  alert( $(this).text() );
});

您可以这样做来获取调用处理程序的实际元素

function myfunc(e)
{
  var _this = e.currentTarget;
  alert( $(_this).text());
}

event.currentTarget

说明:当前DOM元素 在事件冒泡阶段

新增版本:1.3

此属性将始终等于 这个函数的作用是什么


问题在于,事件处理程序调用函数
myfunction()
,而不是传递对它的引用
myfunction
。这改变了它运行的范围。如果向函数传递一个参数,
myfunction
,“this”应按预期工作

更一般地说,如果您真正关心的是知道哪个元素引发了事件,请使用jQuery传递给事件处理程序的规范化事件对象:

$("p").bind("click", function(evt) {
  // this === evt.target;

  alert($(evt.target).text());
});
或:


答案是将其作为参数传递给函数,而不是作为函数的上下文。它确实解决了问题,但每次都会创建一个新的匿名函数;想象一个有400行的表,创建400个新函数?@Omar除非你能指出一些错误,否则我认为它只会创建一个函数,并将所有的
p
点击处理程序指向一个函数。在我知道这是个问题之前,我不会进行优化……我只是举了一个例子。我在一些表行上使用循环,每次都绑定匿名函数。那么它不创造新的功能吗?应该这样。这就是为什么我想使用非匿名函数来避免创建多个函数。@Omar它创建了一个闭包。如果有多个元素,则不应在其上循环。您需要使用适当的jQuery选择器选择所有需要的元素并绑定一次。rahul在我之前发布了它。jQuery已经将
this
设置为您单击的
p
,因此不需要额外的
调用。拉胡尔的回答很好;事实上,如果我正在创建一个通用的
myFunction
,我宁愿将一个元素传递给该函数,也不愿要求调用方使用
call
apply
。对函数引用的理解很好,忘了提到这一点。你是在传递没有参数的函数吗?如果您有参数呢?@Omar您正在传递对函数的引用。按照您在问题中展示的方式,您计算函数并将返回值传递给绑定,这没有多大意义。如果您有参数,可以像rahul的解决方案那样将其包装在函数调用中。@Omar,您的意思是希望事件处理函数能够访问其他信息/参数?请参阅--请参阅本页的“传递事件数据”部分。如果您的意思是如何使用call语句并在上下文之外发送参数,那么答案是将它们作为调用的附加参数放置。例如myfunction.call(thisObj、arg1、arg2等)我也在想同样的事情,但是可以想象,您可能需要从多个地方调用一些方法,包括单击处理程序。在绑定调用时,您正在调用函数myfunction。您希望向要绑定的函数传递一个引用。使用jQuery事件参数是正确的,但是currentTarget在这种情况下没有帮助。在问题所示的示例中,currentTarget将是
窗口
。否。。currentTarget,因为我从e参数(从jQuery绑定传递的实际事件)中提取它,它将指向处理事件的实际元素。。请在以下位置试用:
function myfunc(e)
{
  var _this = e.currentTarget;
  alert( $(_this).text());
}
$("p").bind("click", function(evt) {
  // this === evt.target;

  alert($(evt.target).text());
});
$("p").bind("click", myfunction);

myfunction(evt) {
  alert($(evt.target).text());
}