Pomocy," to " mnie myli w JavaScript

Praca z JavaScript jedną z rzeczy mylących jest użycie tego

var x = {  
  ele : 'test',
  init : function(){ 
    alert(this.ele);
  }
}

Jednak gdy mamy do czynienia z wieloma obiektami, a zwłaszcza zdarzeniami, kontekst this zmienia się i staje się mylący, aby śledzić/rozumieć.

Więc jeśli ktoś ma lepsze wejścia / wytyczne/myśli / lepsze praktyki, Proszę podzielić się. Również chciałbym wiedzieć, czy użycie this daje jakąś (wydajność) przewagę czy co?

Author: unwind, 2010-01-27

5 answers

Nie chodzi o wydajność, chodzi o dostęp do właściwości określonej instancji obiektu:-

x.init()

Nie wyświetla "test", jeśli nie użyłeś this w funkcji.

W praktyce powyższa linia jest taka sama jak:-

x.init.call(x);

Pierwszy parametr w użyciu {[8] } jest przypisany do this podczas wykonywania funkcji.

Teraz rozważ:-

var fn = x.init;  //Note no () so the function itself is assigned to the variable fn
fn();

Teraz nie masz nic w alarmie. To dlatego, że powyższe jest skutecznie: -

fn.call(window);

W przeglądarce hostowanej Javascript obiekt window jest synonimem obiektu globalnego. Gdy funkcja jest wywoływana "w stanie surowym", to this domyślnie jest obiektem globalnym.

Klasyczny błąd robi coś takiego:-

var x = {
   ele: 'test';
   init: function(elem) { 
      elem.onclick = function() { alert(this.ele); }
   }
}
x.init(document.getElementById('myButton'));

To jednak nie działa, ponieważ funkcja dołączona do zdarzenia onclick jest wywoływana przez przeglądarkę za pomocą kodu w stylu:-

onclick.call(theDOMElement)

Stąd gdy funkcja jest uruchomiona this nie jest to, co myślisz jest.

Moje zwykłe rozwiązanie tej sytuacji to:-

var x = {
   ele: 'test';
   init: function(elem) {
      var self = this; 
      elem.onclick = function() { alert(self.ele); }
      elem = null;
   }
}
x.init(document.getElementById('myButton'));

Uwaga elem = null to obejście wycieku pamięci IE.

 27
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 04:33:07

To jest bardzo mylące. To zależy od sposobu wywołania funkcji. Doug Crockford dobrze napisał w swojej książce Javascript, The Good Parts . Istotą tego jest ta doskonała odpowiedź na źle sformułowane pytanie.

I nie, tu nie chodzi o wydajność.

 6
Author: Teun D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30

Dla mnie bardzo pomogły następujące wytyczne: za każdym razem, gdy widzisz this myśl owner. Obiekt, który posiada nazwę zmiennej, do której przypisana jest funkcja, stanie się this. Jeśli nie możesz zrozumieć, kto jest właścicielem, to this będzie window.

 3
Author: Stefano Borini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 10:10:53

Dobrym i pouczającym artykułem na temat słowa kluczowego this jest to (nie zamierzony kalambur). Artykuł może Ci wszystko wyjaśnić, wiem, że zrobił to dla mnie.

Podstawową zasadą jest to, że this słowo kluczowe wewnątrz funkcji zawsze odnosi się do właściciela funkcji, a kluczem do zrozumienia konsekwencji jest zrozumienie, kiedy funkcje są referowane i kiedy są kopiowane . Zobacz wcześniej wspomniany artykuł dla przykładów.

 2
Author: Håvard S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 16:25:02

Użyj

var me = this;

Poza

function(){

Wtedy możesz odwołać się do mnie wewnątrz funkcji ()

 1
Author: PeanutPower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 16:28:39