代码之家  ›  专栏  ›  技术社区  ›  Reigel Gallarde

jQuery.proxy()用法

  •  68
  • Reigel Gallarde  · 技术社区  · 14 年前

    我在看api关于 jQuery.proxy()

    3 回复  |  直到 9 年前
        1
  •  139
  •   Machavity Labib Hussain    9 年前

    当你想要一个函数 this 值绑定到特定对象。例如,在事件处理程序、AJAX回调、超时、间隔、自定义对象等回调中。

    这只是一个虚构的例子,说明它可能有用。假设有一个 Person

    function Person(el) {
        this.name = '';
    
        $(el).change(function(event) {
            // Want to update this.name of the Person object,
            // but can't because this here refers to the element
            // that triggered the change event.
        });
    }
    

    我们经常使用的一种解决方案是将此上下文存储在变量中,并在回调函数中使用,例如:

    function Person(el) {
        this.name = '';
    
        var self = this; // store reference to this
    
        $(el).change(function(event) {
            self.name = this.value; // captures self in a closure
        });
    }
    

    或者,我们可以用 jQuery.proxy 指Person的对象,而不是触发事件的元素。

    function Person(el) {
        this.name = '';
    
        $(el).change(jQuery.proxy(function(event) {
            this.name = event.target.value;
        }, this));
    }
    

    bind 借用的方法 并且已经在一些浏览器上可用。

    function Person(el) {
        this.name = '';
    
        $(el).change(function(event) {
            this.name = event.target.value;
        }.bind(this)); // we're binding the function to the object of person
    }
    
        2
  •  17
  •   Nick Craver    14 年前

    这只是一种为闭包设置上下文的速记方法,例如:

    $(".myClass").click(function() {
      setTimeout(function() {
        alert(this); //window
      }, 1000);
    });
    

    this 保持我们的方法不变 $.proxy()

    $("button").click(function() {
      setTimeout($.proxy(function() {
        alert(this); //button
      }, this), 1000);
    });​
    

    它通常用于延迟的调用,或者任何你不想做一个直接声明闭包的方法的地方。将上下文指向对象的string方法…我还没有在日常代码中遇到实际的用法,但我肯定有应用程序,只是取决于对象/事件结构是什么。

        3
  •  14
  •   Felix Kling    14 年前

    var that = this;
    
    $('button').click(function() {
        that.someMethod();
    });
    

    你可以做:

    $('button').click($.proxy(this.someMethod, this));
    

    或者如果你创建了一个接受回调的插件,你必须为回调设置一个特定的上下文。