2011-12-01 53 views
2

我很困惑與this保留密鑰和案件造成的錯誤。這裏有一個示例代碼,它會導致錯誤。jQuery:保留密鑰本和模棱兩可的情況下

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();

回答

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具有通常具有的特定值以外的值時非常有用。

更多讀數:

+0

感謝您的回答和參考。我是JS和jQuery的新手,每天都很棒。 – Marcos

+0

@Marcos:不用擔心,樂於幫忙。請享用! –

0

我相信,$ .proxy()可以幫助您解決問題: http://api.jquery.com/jQuery.proxy/

+0

'proxy'可以在很多情況下提供幫助,但有兩個理由不在這裏使用:1)他已經*定義了一個閉包,所以'proxy'只是增加了額外的開銷; 2)他在事件處理程序中使用'this'來引用他'hook'的元素,你經常想在事件處理程序中做這件事。使用'proxy'會改變'this = sample',讓你沒有現成的方式來訪問被點擊的實際元素。 (您可以使用'$(event.target).closest(「#list li」),但這需要更多的工作。) –

0

當你insied一個jQuery函數this可以有不同的含義。在這種情況下:

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

這是指點擊的元素等

this.sampleFunction2(); 

試圖訪問的點擊element.You的方法應該複製「這個」

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 
    }); 
0

click()上下文是所點擊的Elemen t,所以這指的是接收到點擊事件的元素。你可以使用sample.sampleFunction2()

相關問題