2013-07-30 6 views
6

W Secrets of Javascript Closures Stuart Langridge prezentuje fragment kodu do wykazania wspólnego wykorzystania zamknięcia w .onclick zwrotnego i parafrazując:W jaki sposób jeden reimplement "var that = this", aby zapisać odniesienie do zakresu Object.prototype.bind()?

link.onclick = function (e) { 
    var newa = document.createElement("a"); 
    var that = this; 
    document.body.appendChild(newa); 
    newa.onclick = function (e) { 
     that.firstChild.nodeValue = "reset"; 
     this.parentNode.removeChild(this); 
    } 
} 

I niedawno natknął Speaker Kyle Simpsons' Deck New Rules For Javascript a on wspomina, że ​​zapisanie zakresu this dla zamknięcia takiego jak var self = this lub (jak w opisie) jest "błędne" i sprawa dla Object.prototype.bind(). < Zgodność z ES5, czuję się bardziej komfortowo, opierając się na konstrukcjach językowych, aby rozwiązać problemy, zamiast używać hacków lub szybkich napraw, ale w tym fragmencie kodu problemem z użyciem bind, apply lub call jest zarówno odniesienie do otaczającej wartości this i potrzebna jest wartość referencyjna zamknięcia wynosząca this.

Czy to przypadek, w którym praktyczność przebija filozofię? Co można zrobić?

+4

W przypadku takim jak twój, gdzie trzeba odniesienie do obu, myślę, że nie można uniknąć zapisywania odniesienie instancji. Jeśli sprawi, że poczujesz się czyściej, możesz przekazać zewnętrzną instancję jako argument do samo-wywołania anonimowej funkcji, która owija się wokół wewnętrznej funkcji, ale semantycznie, to jest to samo. – xbonez

+0

Widziałem, że używane wcześniej, a od twojego opisu, ma sens, dlaczego jest używany: za pomocą zamknięcia, aby zapisać stan zakresu odniesienia. Masz rację, to jest semantycznie to samo, ale z jakiegoś powodu po prostu czuję się lepiej, chociaż mógłbym mieć jakiś rodzaj szowinizmu w stosunku do pierwszorzędnych funkcji ponad prymitywami! – lintuxvi

Odpowiedz

1

Nie traktowałbym twojego przykładu jako błędnego przypadku dla bind tego i to są osobne odniesienia. Błędnym przypadku wiążą byłoby:

var that = this; 

var fn = function() { 
    that.method(); 
} 

return fn; 

vs

var fn = function() { 
    this.method(); 
} 

return fn.bind(this); 
+0

Myślę, że to podsumowuje zakres tej zasady – lintuxvi

3

W ogólnym przypadku, jeśli naprawdę potrzebujesz zarówno this, jak i that, nie możesz po prostu zlikwidować jednego z nich, prawda?

W przypadku obsługi click, powinieneś być w stanie dostać się do elementu, o którym mowa, patrząc na obiekt zdarzenia przekazywana w. Uważam, że ma target własność jakiegoś rodzaju. Więc możesz użyć e zamiast this, a następnie połączyć się, aby uzyskać that jako .

W zależności od struktury strony można również przejść przez DOM, aby uzyskać od this do that, szczególnie jeśli używasz identyfikatora lub klasy do semantycznego oznaczania elementów.

+0

Z mojej wiedzy całkowicie się zgadzam. Przykład wygląda jak praktyczny przypadek zapisania odniesienia do "tego". Preferencyjnie odniesienie do "parentNode" z parametru zdarzenia wywołania zwrotnego wydaje się lepszym odniesieniem w tym kontekście. Być może kluczowe jest to, że na wynos: kontekst w kodzie przeważa nad regułami. – lintuxvi

Powiązane problemy