【问题标题】:How to access attribute in jQuery callback func?如何访问 jQuery 回调函数中的属性?
【发布时间】:2011-11-05 11:45:27
【问题描述】:
var some_name =
{
    moving:false,

    show : function ()
    {
        this.moving = true;

        $('element').slideDown(5000, function ()
        {
            this.moving = false; //How to access to attribute "moving" of class some_name?
        });
    },
}

代码中的问题。

【问题讨论】:

    标签: javascript jquery oop class object


    【解决方案1】:

    您可以将回调函数绑定到当前上下文:

    $('element').slideDown(5000, $.proxy(function() {
        this.moving = false;
    }), this); // "this" inside of the function will be this "this"
    

    jQuery.proxy


    您也可以这样做:

    this 是当前上下文,它的值取决于函数的调用方式。您可以将this 分配给函数外部的变量,并改用此变量:

    var that = this;
    $('element').slideDown(5000, function() {
        that.moving = false; //use that instead of this here
    });
    

    【讨论】:

    • 你的例子中$.proxy的主要问​​题是它是一个函数调用inside另一个函数调用的参数列表,所以很容易错过第二个右括号@ 987654328@ - 正如你所展示的那样:p
    • 如果您不需要从对象外部访问“移动”,只需删除 this。在移动之前。它的工作方式与您访问“那个”的方式完全相同......当您需要从回调中访问“这个”时,这个答案是经典答案。但是,如果您只需要您不会从外部访问的访问变量,那就大材小用了。
    【解决方案2】:

    使用moving 而不是this.moving(在这两种情况下)

    变量在使用时会绑定到上下文,因此即使在您的事件回调中,您也可以访问上面的变量。

    【讨论】:

    • 这将不允许对象的其他方法访问moving
    • 其他方法只要在方法之外声明移动就可以访问。唯一的事情是“移动”将是一个私有变量。您上面的解决方案有效,但在我看来它有点矫枉过正。
    • 您必须将整个对象 + 移动变量包装在 IIFE 中以使其私有
    • 当然,对不起,当我说“私人”时,我的意思是没有很好的访问器,比如“object.movi​​ng”
    【解决方案3】:

    在事件回调中,this 指的是event.target,或捕获事件的元素。

    您可以利用 javascript 中的闭包并访问 moving 属性,如下所示:

    show : function ()
    {
        var moving = true;
    
        $('element').slideDown(5000, function ()
        {
            moving = false;
        });
    },
    

    请注意,不过,这个moving 将不同于some_name 中的第一个moving

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2018-07-12
      • 2014-02-08
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多