代码之家  ›  专栏  ›  技术社区  ›  Omar Abid

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

  •  3
  • Omar Abid  · 技术社区  · 15 年前

    假设我有以下代码

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

    当用户单击 <p> 一个警报出现了。这里的好处是,我使用了“this”关键字。

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

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

    这是指窗户。我该怎么解决?

    更新:

    回答者建议的解决方案

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

    这很好,但是每次调用这一行代码时都会创建一个新函数,不是吗?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Larry K    15 年前

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

    在javascript中,这是通过使用call完成的。见 here

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

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

    补充:

    我查找了jquery bind,jonathon是对的,上下文被自动设置为您将事件侦听器添加到的原始元素。

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

    尝试

    $("p").bind("click", myfunction);
    var myfunction = function(){
      alert( $(this).text() );
    }
    
        2
  •  3
  •   rahul    15 年前

    有点像

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

    这里也没有删除匿名函数。但在里面你可以调用另一个函数。

        3
  •  1
  •   Reigel Gallarde    15 年前

    我在想,你为什么要那样做?

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

    当您可以像这样添加更多选择器时:

    $("p,div,li,:button").bind("click", function(){
      alert( $(this).text() );
    });
    
        4
  •  1
  •   Gabriele Petrioli    15 年前

    您可以这样做来获取调用处理程序的真正元素。

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

    根据 jQuery documentation

    事件.当前目标

    描述: 当前的dom元素 在事件冒泡阶段。

    增加版本:1.3

    此属性将始终等于 这个 函数的。

        5
  •  1
  •   Dave Ward    15 年前

    问题是你的事件处理程序正在调用函数, myfunction() ,而不是传递对它的引用, myfunction . 这就是改变它运行范围的原因。如果给函数传递一个参数, 肌力函数 “这个”应该能按预期工作。

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

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

    或:

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