2010-09-08 10 views
5

Jako ktoś, kto próbuje podejść bardziej obiektowo do mojego programowania javascript uderzyłem w przeszkodę, która na pewno jest prawdopodobnie czymś bardzo podstawowym, ale weźmy następującą implementację obiektu (załóżmy, że obiekt jQuery jest dostępna dla tego kodu):JavaScript Zakres pytanie

function Foo() 
{ 
    this.someProperty = 5; 
} 

Foo.prototype.myFunc = function() 
{ 
    //do stuff... 
}; 

Foo.prototype.bar = function() 
{ 
    //here 'this' refers to the object Foo 
    console.log(this.someProperty); 

    $('.some_elements').each(function() 
    { 
     //but here, 'this' refers to the current DOM element of the list of elements 
     //selected by the jQuery selector that jquery's each() function is iterating through 
     console.log(this); 

     //so, how can i access the Foo object's properties from here so i can do 
     //something like this? 
     this.myFunc(); 
    }); 
}; 

Odpowiedz

6

można tymczasowo użyć innej zmiennej, aby wskazać poprawną tym:

Foo.prototype.bar = function() 
{ 
    //here 'this' refers to the object Foo 
    console.log(this.someProperty); 

    var self = this; 

    $('.some_elements').each(function() 
    { 
     self.myFunc(); 
    }); 
}; 
+0

Wiedziałem, że to będzie coś prostego, dzięki :-) –

5

Przed wprowadzić function przechodzą do each, trzeba uchwycić this funkcji zewnętrznej w zmiennej, a następnie użyć zmiennej wewnątrz function że przechodzą na each.

function Foo() 
{ 
    this.someProperty = 5; 
} 

Foo.prototype.myFunc = function() 
{ 
    //do stuff... 
}; 

Foo.prototype.bar = function() 
{ 
    // in here, this refers to object Foo 

    // capture this in a variable 
    var that = this; 

    $('.some_elements').each(function() 
    { 
     // in here, this refers to an item in the jQuery object 
     // for the current iteration 

     console.log(that); 
     that.myFunc(); 
    }); 
}; 

Jak już dowiedzieliśmy, this wewnątrz funkcji, które przechodzą do each odnosi się do bieżącego elementu w obiekcie jQuery na każdej iteracji czyli pierwszej iteracji odnosi się do pozycji w nieruchomości 0, druga iteracja dotyczy pozycja na własność 1 itd

0

Ty odkrywając usef ulness z JavaScript closures. Są niesamowicie potężne i przydatne do tworzenia zwięzłego kodu. Jest to jedna z najbardziej przydatnych funkcji JavaScript, którą możesz spróbować zrozumieć.