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ć?
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
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