jQuery:保留关键这个,以及模棱两可的案例

时间:2011-12-01 10:43:42

标签: jquery

我与this保留密钥混淆,导致错误。这是一个导致错误的示例代码。

var sample = {
    init: function() {
        this.sampleFunction0();
        this.sampleFunction1();
    },
    sampleFunction0 : function(){
        var something0, something1, something2;
        something0 = this.sampleFunction2(); // works, there is no ambiguity whit 'this'
        jQuery('#list li').click(function(){
            something1 = this.sampleFunction2(); // ambiguity: not works, but sample.sampleFunction2(); works
            something1 = sample.sampleFunction2(); // it´s works
            something2 = $(this).text(); // list item val
            console.log(something0) // something
            console.log(something1); // something : using sample.sampleFunction2();
            console.log(something2); // item val
        });
    },
    sampleFunction1 : function(){
        return 'someting';
    },
    sampleFunction2 : function(){
        return 'something';
    }
}

jQuery(document).ready(function(){
    sample.init();
});

我不知道使用sample.sampleFunction2();代替this.sampleFunction2();

是否正确

4 个答案:

答案 0 :(得分:2)

从你的问题我想你可能知道这一点,但是:在事件处理程序中,this指的是你挂钩事件的元素,这当然是为什么this.sampleFunction2()不起作用的原因。因此,this将是被点击的li元素 - 这通常非常方便。

在您的具体情况下,使用sample而不是this是可以的,因为您的sample对象是一次性的,因此不会超过一个。是的,只需使用sample.sampleFunction2();代替this.sampleFunction2();

如果可能有多个(通过构造函数创建的东西等),在这种情况下做的典型事情(没有双关语)是在闭包中定义局部变量(你的函数你'重新进入click)可以关闭:

sampleFunction0 : function(){
    var something0, something1, something2, self = this; // <==== CHANGE
    something0 = this.sampleFunction2(); // works, there is no ambiguity whit 'this'
    jQuery('#list li').click(function(){
        something1 = self.sampleFunction2(); // <==== CHANGE
        something2 = $(this).text(); // list item val
    });
},

有时使用jQuery的proxy函数是有用的,但在这种情况下不是这样,因为A)你已经定义了一个闭包,而B)你正在使用其他的this。当你试图绑定一个你在其他地方定义的函数时,proxy非常有用,当你需要this来获得一个特定的值而不是通常的值时。{/ p>

更多阅读:

答案 1 :(得分:0)

我相信,$ .proxy()可以帮助您解决此问题: http://api.jquery.com/jQuery.proxy/

答案 2 :(得分:0)

当你被攻击时,jQuery函数this可以有不同的含义。在这种情况下:

 jQuery('#list li').click(function(){ 

这是指被点击的元素,所以

 this.sampleFunction2();

尝试访问被点击元素的方法。您应该复制“this”

 var that = this;
 jQuery('#list li').click(function(){
        something1 = that.sampleFunction2(); /
        something2 = $(this).text(); // list item val
        console.log(something0) // something
        console.log(something1); // something : using sample.sampleFunction2();
        console.log(something2); // item val
    });

答案 3 :(得分:0)

click()中的上下文是单击的元素,因此这指的是接收到click事件的元素。您可以使用sample.sampleFunction2()